我猜这是一个哲学问题。我需要收集一组患者的病理结果并将它们存储在数据库中。以前我用过很简单的表结构(简化版):
+-------------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------------+--------------+------+-----+---------+-------+
| ID | bigint(20) | NO | PRI | NULL | |
| Updated | datetime | NO | PRI | NULL | |
| PatientId | varchar(255) | NO | | NULL | |
| Name | varchar(255) | NO | | NULL | |
| Value | varchar(255) | NO | | NULL | |
+-------------------+--------------+------+-----+---------+-------+
在模式设计中我经常看到:
+-------------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------------+--------------+------+-----+---------+-------+
| ID | bigint(20) | NO | PRI | NULL | |
| PatientId | varchar(255) | NO | | NULL | |
| Ph_Value | varchar(255) | NO | | NULL | |
| K_Value | varchar(255) | NO | | NULL | |
| Ca_Value | varchar(255) | NO | | NULL | |
| Ph_Value_updated | datetime | NO | | NULL | |
| K_Value_updated | datetime | NO | | NULL | |
| Ca_Value_updated | datetime | NO | | NULL | |
+-------------------+--------------+------+-----+---------+-------+
在我看来,第一个设计更加灵活、可扩展等。但是,当记录达到数百万时,我确实想知道性能会受到影响。
第二个问题是有时可能需要记录几百个字段。
我真的很想就此获得评论/建议/指导。
最佳答案
您完全正确,第一个模式要灵活得多:您可以在不更改模式的情况下在实时数据库中添加新键。然而,灵 active 通常是用时间和/或空间买来的。在这种情况下,两者都是:您需要更多空间来存储同一行的所有键,因为 ID
被复制了 N
次,以及获取字段在一起需要时间。
除非您需要,否则没有理由为灵 active 付费。如果您的大部分查询需要大部分列,则第二个结果是最经济的。但是,如果您的大部分查询都要求单列,那么获得灵 active 可能值得花费 CPU 时间和数据库空间。
关于mysql - 数据库架构 : Key/Value table or all keys in one record,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21842177/