你正在使用一个名为实体属性值模型的数据库模型。 这是在关系数据库中存储键值对的常见方式,但它在数据库规范化和效率方面有一些弱点。
是的,你展示的表设计是最常用的方法。 在这个设计中,每个实体的每个属性都在你的KeyValue
表中得到了一个独立的行。
将键/值对应用于一组项目:你需要为组中的每个项目添加一行。
INSERT INTO KeyValue (id, key, value) VALUES (101, 'color', 'green');
INSERT INTO KeyValue (id, key, value) VALUES (102, 'color', 'green');
INSERT INTO KeyValue (id, key, value) VALUES (103, 'color', 'green');
您还可以使用参数准备INSERT语句,并通过循环或其他方式运行一系列项ID。
枚举所有当前激活的键:
SELECT DISTINCT Key FROM KeyValue;
确定所有具有给定键的值的项目:
SELECT id FROM KeyValue WHERE Key = 'color';
确定所有值与给定键关联且符合某些条件的项目:
SELECT id FROM KeyValue WHERE Value = 'green';
实体属性值(Entity-Attribute-Value)存在以下问题:
- 没有办法确保所有项目的键名拼写相同。
- 没有办法使某些键对所有项目强制要求(即在传统表设计中的非空)。
- 所有键必须使用VARCHAR作为值;不能针对每个键存储不同的数据类型。
- 没有办法使用引用完整性;不能创建一个适用于某些键的值而不是其他键值的外键(FOREIGN KEY)。
基本上,实体属性值不是一种规范化的数据库设计。