我想制作一张存放医生的桌子。我的问题是如何存储医生的专业知识,因为医生可以拥有不止一个(壮阳学家、皮肤科医生)。到目前为止,我已经考虑使用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'
医生有两个专业(阿尔法,贝塔)将不包括在结果。我唯一想到的就是用LIKE代替WHERE,但我认为一定有更好的方法。实现这一点的最佳方法是什么(可能是与varchar不同的数据类型)?
发布于 2013-10-30 18:58:34
这是一段多到多的关系。每个医生可能有多个专业,许多医生有每个专业。
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';
有些人不喜欢加入,因为他们认为自己很慢。他们不遗余力地避免连接,例如使用可能更糟糕的依赖子查询。有了适当的索引,联接就不会慢。
发布于 2013-10-30 18:49:46
您可以使用类型集http://dev.mysql.com/doc/refman/5.5/en/set.html,然后您可以找到数据,甚至使用位字段映射。但是要小心,这种类型有一些局限性。看一看文档。
发布于 2013-10-30 18:50:10
使用以下列创建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。
https://stackoverflow.com/questions/19691277
复制相似问题