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

标签 mysql database

我想创建一个存储医生的表。我的问题是我将如何存储医生的专长,因为医生可以拥有多个专长(春药学家、皮肤科医生)。到目前为止,我已经想到使用 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/

相关文章:

python - 遍历数据库表中所有行的最佳方法

mysql - NxM表查询

php - 将加权平均值添加到返回的mysql查询并将所有数据相加

mysql - 单表继承和字段列表中的未知列

php - 使用 MySQL 和 PHP 搜索多个值的最有效方法

c - 如何修改 C 上文件中的变量?

mongodb - 如何使用 Mongodb 和 nodejs 使我的应用程序符合 HIPAA 标准?

sql-server - 在 iOS 上通过套接字编程连接到 SQL Server

mysql - 汇总盘中数据

mysql - 错误代码 : 1109. 删除语句中的未知表 'takes'