数据库架构:键/值表或一个记录中的所有键

时间:2014-02-18 00:41:41

标签: mysql sql database

我想这有点像一个哲学问题。我需要为一组患者收集病理结果并将其存储在数据库中。在过去,我使用了一个非常简单的表结构(简化):

+-------------------+--------------+------+-----+---------+-------+
| 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    |       |
+-------------------+--------------+------+-----+---------+-------+

在我看来,第一个设计更加灵活,可扩展等。但是,当记录达到数百万时,我确实想知道性能命中率。

第二个问题是有时可能需要记录几百个字段。

我真的很想收到关于此的意见/建议/指导。

2 个答案:

答案 0 :(得分:1)

在我看来,如果名称/值对不会发生太大变化,那么第二个选项在空间和行数方面要好得多。

另外,您可以使用另一种解决方案来优化第一个模式,将名称放在另一个表中,只需将name_id放在一起,而不是多次重复使用相同的名称。

另一个模式是拥有患者表和每个包含patient_id和值的值的表,表名是该值的名称

答案 1 :(得分:1)

您是绝对正确的,第一个架构更灵活:您可以在实时数据库上添加新密钥而无需更改架构。但是,通常在时间和/或空间上购买灵活性。在这种情况下,它们都是:您需要更多空间来存储同一行的所有键,因为ID被复制N次,并且将字段组合在一起所需的连接或排序需要时间。

除非您需要,否则没有理由支付灵活性。如果您的大多数查询需要大多数列,则第二个结果是最经济的。但是,如果您的大多数查询都要求使用单个列,那么获得灵活性可能值得花费CPU时间和数据库空间。