gpt4 book ai didi

MySQL - 我应该使用什么数据类型来存储一组字符串

转载 作者:搜寻专家 更新时间:2023-10-30 23:11:23 25 4
gpt4 key购买 nike

我想创建一个存储医生的表。我的问题是我将如何存储医生的专长,因为医生可以拥有多个专长(春药学家、皮肤科医生)。到目前为止,我已经想到使用 varchar 类型并以逗号分隔格式存储值。

CREATE TABLE IF NOT EXISTS `doctors` (
`doctor_id` int(11) NOT NULL AUTO_INCREMENT,
`email` varchar(50) NOT NULL,
`password` varchar(30) NOT NULL,
`firstname` varchar(30) NOT NULL,
`lastname` varchar(30) NOT NULL,
`speciality` varchar(254) NOT NULL,
`lat` decimal(10,8) NOT NULL,
`lng` decimal(10,8) NOT NULL,
`phone` char(10) NOT NULL,
`mobile` char(10) NOT NULL,
PRIMARY KEY (`doctor_id`)
);

但我的问题是在查询表格时。如果我想找到具有“阿尔法”专长的医生,我会这样做

select * from doctors where speciality='alfa'

具有两个专业(alfa,beta)的医生不会被包含在结果中。我唯一想到的是使用 LIKE 而不是 WHERE,但我认为必须有更好的方法。实现它的最佳方法是什么(可能是与 varchar 不同的数据类型)?

最佳答案

这是一个多对多的关系。每个医生都可能有多个专长,而且很多医生都有每个专长。

Doctors >--------< Specialties

在关系数据库中表示多对多关系的方式不是用逗号分隔的列表,而是用另一个表。

Doctors ----< HasSpecialty >---- Specialties 

这是一个例子:

CREATE TABLE HasSpecialty (
specialty_id INT,
doctor_id INT,
PRIMARY KEY (specialty_id, doctor_id),
KEY (doctor_id, specialty_id),
FOREIGN KEY (doctor_id) REFERENCES Doctors(doctor_id),
FOREIGN KEY (specialty_id) REFERENCES Specialties(specialty_id)
);

查询具有给定专业的医生,执行 JOIN:

SELECT d.* FROM Doctors AS d
INNER JOIN HasSpecialty AS hs USING (doctor_id)
INNER JOIN Specialties AS s USING (specialty_id)
WHERE s.specialty = 'alfa';

有些人不喜欢 JOIN,因为他们认为它们很慢。他们竭尽全力避免 JOIN,例如使用可能更糟的依赖子查询。使用适当的索引,连接不会很慢。

关于MySQL - 我应该使用什么数据类型来存储一组字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19691277/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com