我正在为一家处理患者病历的初创公司设计一个MySQL数据库。我有几张表没有唯一的密钥:医疗条件,过敏,家族病史等。例如,medications
表可能包含字段patient_id
,med_name
,usage_dates
,dosage
,reason
等。唯一保证的唯一键是所有字段。
通过选择patient_id
,Web应用程序可以轻松地为给定患者检索此数据,但除非可以将指针保存到具有多个用户的数据库内的行,否则它会让我感到笨拙的编辑系统或删除此表中的行。 DBMS必须为每个字段的值选择以便找到正确的行。从我对数据库的了解(我很少),我想在大型数据库中这可能是低效的。
创建一个具有ID号的新字段作为每个表中的主键是否更有效,或者DBMS是否比我更聪明,这是完全没必要的?
答案 0 :(得分:2)
您始终可以添加一个简单的数字主键(例如mysql auto_increment),这样您最终会得到每行的唯一标识符。如果必须在外键关系中使用表,复合主键是一个严重的问题,迫使您列出所有连接/ FK规范中每个主键的组件字段。相比之下,添加一个简单的int主键可以减少你为FK / join关系携带那个ONE字段。
我建议采用以下方式:
patients (id, name, ....)
meds (id, brand, name, ...)
patient_meds (patient_id, med_id, dosage, ...)
答案 1 :(得分:1)
是的,这将被称为“合成密钥”,我当然会添加一个,可能只是一个AUTO_INCREMENT字段。如果你这样做,它会使更新变得更简单(也更快)。
答案 2 :(得分:1)
我认为身份证领域几乎总是一个好主意。它保证您可以使用一列来唯一标识数据库中的一行。我也认为这是一个好主意,因为它可以使您的查询更快,因为表的主键是索引的,所以如果您根据唯一ID列进行选择,MySQL不必搜索所有行来查找您正在寻找。它确切地知道去哪里,你的查询运行得更快。
答案 3 :(得分:1)
是的,这是“最佳做法”。除了更新之外,它还可以更快地删除和连接。
许多第三方工具都依赖于唯一的主键。