我正在为一家处理病人医疗记录的初创公司设计一个MySQL数据库。我有几个表可以没有唯一键:医疗条件、过敏症、家族史等。例如,medications表可能有字段patient_id、med_name、usage_dates、dosage、reason等。唯一保证的唯一键是所有字段在一起。
web应用程序可以通过选择for patient_id轻松地检索给定患者的这些数据,但除非可以保存指向具有多个用户的数据库中的行的指针,否则它在我看来是一个用于编辑或删除该表中的行的笨拙系统。DBMS必须为每个字段的值进行选择,以便找到正确的行。根据我对数据库的了解(很少),我认为在大型数据库中这可能是低效的。
在每个表中创建一个带有ID号的新字段作为主键是否更有效,或者DBMS方式比我更聪明,这是完全没有必要的吗?
发布于 2012-01-13 23:24:48
您总是可以添加一个简单的数字主键(例如mysql auto_increment),这样您就可以为每一行添加一个唯一的标识符。如果您必须在外键关系中使用表,则复合主键是一个非常痛苦的问题,它会迫使您在所有joins/FK规范中列出每个主键的组件字段。相比之下,添加一个简单的int主键将使您只需为FK/join关系携带一个字段。
我会建议一些类似的东西:
patients (id, name, ....)
meds (id, brand, name, ...)
patient_meds (patient_id, med_id, dosage, ...)发布于 2012-01-13 23:21:37
是的,这将被称为“合成键”,我肯定会添加一个,可能只是一个AUTO_INCREMENT字段。如果你这样做,它将使更新变得更简单(更快)。
发布于 2012-01-13 23:23:22
我认为ID字段几乎总是一个好主意。它保证有一列可用于唯一标识数据库中的一行。我还认为这是一个好主意,因为它可以使查询更快,因为表的主键是有索引的,所以如果您根据唯一ID列进行选择,MySQL不必搜索所有行来查找您要查找的行。它确切地知道去哪里,你的查询将运行得更快。
https://stackoverflow.com/questions/8852758
复制相似问题