我想这有点像一个哲学问题。我需要为一组患者收集病理结果并将其存储在数据库中。在过去,我使用了一个非常简单的表结构(简化):
+-------------------+--------------+------+-----+---------+-------+
| 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 | |
+-------------------+--------------+------+-----+---------+-------+
在我看来,第一个设计更加灵活,可扩展等。但是,当记录达到数百万时,我确实想知道性能命中率。
第二个问题是有时可能需要记录几百个字段。
我真的很想收到关于此的意见/建议/指导。
答案 0 :(得分:1)
在我看来,如果名称/值对不会发生太大变化,那么第二个选项在空间和行数方面要好得多。
另外,您可以使用另一种解决方案来优化第一个模式,将名称放在另一个表中,只需将name_id放在一起,而不是多次重复使用相同的名称。
另一个模式是拥有患者表和每个包含patient_id和值的值的表,表名是该值的名称
答案 1 :(得分:1)
您是绝对正确的,第一个架构更灵活:您可以在实时数据库上添加新密钥而无需更改架构。但是,通常在时间和/或空间上购买灵活性。在这种情况下,它们都是:您需要更多空间来存储同一行的所有键,因为ID
被复制N
次,并且将字段组合在一起所需的连接或排序需要时间。
除非您需要,否则没有理由支付灵活性。如果您的大多数查询需要大多数列,则第二个结果是最经济的。但是,如果您的大多数查询都要求使用单个列,那么获得灵活性可能值得花费CPU时间和数据库空间。