现在公司有多个人员,每个人有多本职业证书,每个证书有多个专业,如何实现条件叠加的筛选?比如我想查同时有一建证专业是市政加土建的,也有造价证专业是土建加安装的人员。用mysql数据怎么设计?用elasticsearch怎么设计?
对于这个场景,可以考虑使用关系型数据库 MySQL 进行数据设计。可以设计以下几张表:
-
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;
-
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;
-
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": ["土建", "安装"]
}
}
]
}
}
}
}
]
}
}
}
这个查询语句可以查询同时有一建证专业是市政加土建的,也有造价证专业是土建加安装的人员。