mysql - 数据库架构 : Key/Value table or all keys in one record

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

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

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

我真的很想就此获得评论/建议/指导。

最佳答案

您完全正确,第一个模式要灵活得多:您可以在不更改模式的情况下在实时数据库中添加新键。然而,灵 active 通常是用时间和/或空间买来的。在这种情况下,两者都是:您需要更多空间来存储同一行的所有键,因为 ID 被复制了 N 次,以及获取字段在一起需要时间。

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

关于mysql - 数据库架构 : Key/Value table or all keys in one record,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21842177/

相关文章:

Python MySQLdb : table does not get deleted immediately

php - Join 和 Left Join 不拉取数据

sql - 在 SQL Server 中查询非常规人名

sql - SSIS 序列容器事务选项

php - Slim POST 方法不会发送到 MySQL

mysql - 当列设置级联时如何删除表

sql - 递归oracle sql来识别一个值

database - 如何在 PostgreSQL 上实现表修改的审计/版本控制

mysql - 修改 SQL 查询以仅获取过去 2 个月的数据

java - 如何检测待处理的 JDO 事务?