我想创建一个存储医生的表格。我的问题是如何存储医生的专业,因为医生可以有多个(aphrodisiologist,皮肤科医生)。到目前为止,我已经开始使用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`)
);
但我的问题是在查询表格时。如果我想找到有专业'alfa'的医生,我会这样做
select * from doctors where speciality='alfa'
具有两个专业(阿尔法,贝塔)的医生将不包括在结果中。我唯一想到的是使用LIKE而不是WHERE,但我认为必须有更好的方法。实现它的最佳方法是什么(可能是与varchar不同的数据类型)?
答案 0 :(得分:2)
这是一种多对多的关系。每个医生都可能有多个专业,而且许多医生都有各自的专业。
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)
);
查询具有特定专长的医生,请加入:
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,例如使用可能更糟的依赖子查询。使用适当的索引,连接速度不会很慢。
答案 1 :(得分:0)
您可以使用类型SET http://dev.mysql.com/doc/refman/5.5/en/set.html然后您甚至可以使用位字段映射查找数据。但要小心这种类型有一些限制。看看文档。
答案 2 :(得分:0)
使用以下列创建doctor_specialties
的表:
doctor_id int not null
specialty varchar(254) not null
doctor_id
应该是doctors
的外键,并考虑在两列上创建一个2列主键。
在此表中插入记录,引用医生及其专业。如果医生有多个专业,你会有多个记录。
然后,要查询具有特定专长的医生,您可以这样做:
select * from doctors d
where exists (select * from doctor_specialties
where doctor_id = d.doctor_id
and specialty = 'alfa');
有许多方法可以编写此查询,包括子选择或连接。当我不需要在另一个表中返回信息时,我使用EXISTS。