首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL -我应该使用什么数据类型来存储一组字符串

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

Stack Overflow用户
提问于 2013-10-30 18:43:17
回答 3查看 1.2K关注 0票数 1

我想制作一张存放医生的桌子。我的问题是如何存储医生的专业知识,因为医生可以拥有不止一个(壮阳学家、皮肤科医生)。到目前为止,我已经考虑使用varchar类型和存储以逗号分隔格式的值。

代码语言:javascript
运行
复制
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`)
);

但我的问题是当我翻开桌子的时候。如果我想找那些有专业“阿尔法”的医生我就这么做

代码语言:javascript
运行
复制
select * from doctors where speciality='alfa'

医生有两个专业(阿尔法,贝塔)将不包括在结果。我唯一想到的就是用LIKE代替WHERE,但我认为一定有更好的方法。实现这一点的最佳方法是什么(可能是与varchar不同的数据类型)?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-30 18:58:34

这是一段多到多的关系。每个医生可能有多个专业,许多医生有每个专业。

代码语言:javascript
运行
复制
Doctors >--------< Specialties

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

代码语言:javascript
运行
复制
Doctors ----< HasSpecialty >---- Specialties 

下面是一个例子:

代码语言:javascript
运行
复制
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)
);

查询具有特定专业的医生时,请加入:

代码语言:javascript
运行
复制
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';

有些人不喜欢加入,因为他们认为自己很慢。他们不遗余力地避免连接,例如使用可能更糟糕的依赖子查询。有了适当的索引,联接就不会慢。

票数 2
EN

Stack Overflow用户

发布于 2013-10-30 18:49:46

您可以使用类型集http://dev.mysql.com/doc/refman/5.5/en/set.html,然后您可以找到数据,甚至使用位字段映射。但是要小心,这种类型有一些局限性。看一看文档。

票数 0
EN

Stack Overflow用户

发布于 2013-10-30 18:50:10

使用以下列创建doctor_specialties表:

代码语言:javascript
运行
复制
doctor_id int not null
specialty varchar(254) not null

doctor_id应该是doctors的外键,并考虑在这两列上设置一个2列主键。

在本表中插入记录,引用医生及其专长。如果医生有多个专业,你就会有多个记录。

然后,要询问具有特定专业的医生,您可以这样做:

代码语言:javascript
运行
复制
select * from doctors d 
where exists (select * from doctor_specialties 
              where doctor_id = d.doctor_id 
                  and specialty = 'alfa');

编写此查询有多种方法,包括子选择或联接。当不需要返回另一个表中的信息时,我使用EXISTS。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19691277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档