Skip to content

  • 体验新版
    • 正在加载...
  • 登录
  • KnowledgePlanet
  • docdoc
  • Issue
  • #16

doc
doc
  • 项目概览

KnowledgePlanet / doc

通知 1303
Star 822
Fork 117
  • 代码
    • 文件
    • 提交
    • 分支
    • Tags
    • 贡献者
    • 分支图
    • Diff
  • Issue 42
    • 列表
    • 看板
    • 标记
    • 里程碑
  • 合并请求 0
  • DevOps
    • 流水线
    • 流水线任务
    • 计划
  • Wiki 2
    • Wiki
  • 分析
    • 仓库
    • DevOps
  • 项目成员
  • Pages
doc
doc
  • 项目概览
    • 项目概览
    • 详情
    • 发布
  • 仓库
    • 仓库
    • 文件
    • 提交
    • 分支
    • 标签
    • 贡献者
    • 分支图
    • 比较
  • Issue 42
    • Issue 42
    • 列表
    • 看板
    • 标记
    • 里程碑
  • 合并请求 0
    • 合并请求 0
  • Pages
  • DevOps
    • DevOps
    • 流水线
    • 流水线任务
    • 计划
  • 分析
    • 分析
    • 仓库分析
    • DevOps
  • Wiki 2
    • Wiki
  • 成员
    • 成员
  • 收起侧边栏
  • 动态
  • 分支图
  • 创建新Issue
  • 流水线任务
  • 提交
  • Issue看板
You need to sign in or sign up before continuing.
已关闭
开放中
Opened 6月 16, 2023 by 小傅哥@Yao__Shun__Yu⛹Owner

现在公司有多个人员,每个人有多本职业证书,每个证书有多个专业,如何实现条件叠加的筛选?比如我想查同时有一建证专业是市政加土建的,也有造价证专业是土建加安装的人员。用mysql数据怎么设计?用elasticsearch怎么设计?

对于这个场景,可以考虑使用关系型数据库 MySQL 进行数据设计。可以设计以下几张表:

  1. person 表,用于记录每个人员的基本信息,比如姓名、性别、年龄等。表结构如下:
CREATE TABLE `person` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `gender` varchar(10) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  1. certificate 表,用于记录每个人员的职业证书信息,比如证书名称、证书编号等。表结构如下:
CREATE TABLE `certificate` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `person_id` int(11) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `number` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `person_id` (`person_id`),
  CONSTRAINT `certificate_person_fk` FOREIGN KEY (`person_id`) REFERENCES `person` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  1. profession 表,用于记录每个证书的专业信息,比如专业名称、专业代码等。表结构如下:
CREATE TABLE `profession` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `certificate_id` int(11) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `code` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `certificate_id` (`certificate_id`),
  CONSTRAINT `profession_certificate_fk` FOREIGN KEY (`certificate_id`) REFERENCES `certificate` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

在这个设计中,person 表和 certificate 表是一对多的关系,certificate 表和 profession 表也是一对多的关系。这样可以方便地查询每个人员的证书和专业信息,并进行条件叠加的筛选。

比如,要查询同时有一建证专业是市政加土建的,也有造价证专业是土建加安装的人员,可以使用以下 SQL 语句:

SELECT p.name
FROM person p
INNER JOIN certificate c1 ON p.id = c1.person_id
INNER JOIN profession pr1 ON c1.id = pr1.certificate_id AND pr1.name = '一建证' AND pr1.code IN ('市政', '土建')
INNER JOIN certificate c2 ON p.id = c2.person_id
INNER JOIN profession pr2 ON c2.id = pr2.certificate_id AND pr2.name = '造价证' AND pr2.code IN ('土建', '安装');

对于 Elasticsearch,可以考虑将每个人员的信息作为一个文档,使用多字段进行存储。比如,可以使用以下字段:

  • name:人员姓名
  • gender:人员性别
  • age:人员年龄
  • certificates.name:证书名称
  • certificates.number:证书编号
  • certificates.professions.name:专业名称
  • certificates.professions.code:专业代码

在查询时,可以使用 Elasticsearch 的多字段查询功能进行条件叠加的筛选。比如,可以使用以下查询语句:

GET /person/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "certificates",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "certificates.name": "一建证"
                    }
                  },
                  {
                    "terms": {
                      "certificates.professions.code": ["市政", "土建"]
                    }
                  }
                ]
              }
            }
          }
        },
        {
          "nested": {
            "path": "certificates",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "certificates.name": "造价证"
                    }
                  },
                  {
                    "terms": {
                      "certificates.professions.code": ["土建", "安装"]
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}

这个查询语句可以查询同时有一建证专业是市政加土建的,也有造价证专业是土建加安装的人员。

指派人
分配到
无
里程碑
无
分配里程碑
工时统计
无
截止日期
无
标识: KnowledgePlanet/doc#16
渝ICP备2023009037号

京公网安备11010502055752号

网络110报警服务 Powered by GitLab CE v13.7
开源知识
Git 入门 Pro Git 电子书 在线学 Git
Markdown 基础入门 IT 技术知识开源图谱
帮助
使用手册 反馈建议 博客
《GitCode 隐私声明》 《GitCode 服务条款》 关于GitCode
Powered by GitLab CE v13.7