我最近开始使用的一个数据库设计有一个包含所有可能值的主表,而其他表中的外键指定了每个项目的性质。
CREATE TABLE entity
(
indexid INTEGER PRIMARY KEY NOT NULL,
entitytype INTEGER,
entityname VARCHAR,
);
例如,这个主表包含一个名为“entityname”的字段,可能包含以下记录:
- 商品的upc代码
- 项目的简称
- 项目的长名称
- 物品的位置
- 此项目的供应商
- 库存数量
- (和许多其他人)
该表中的每条记录都有一个实体类型编号作为外键,在另一个表中引用每条记录的含义,例如
entitytype=10 表示这个实体是UPC码类型,然后
entitytype=12 表示该实体是供应商名称类型等...
显然,实体有十几种这样的类型。
我觉得有点不直观。这里有这篇文章(参见一个表格来保存所有域值部分),作者建议我在示例中表达的方法可能不是最好的方法,我倾向于同意他对事情。
我也认为很难进行有效的查询,我觉得这不是应该这样做的。我宁愿有更多的表格并保持整体更直观。我有一个时间窗口可以重新设计它,并且正在考虑长期和最佳实践。
那么从长远来看,这种方法可以被认为是一种好的做法,而我只需要处理它吗?
该设计结构通常称为实体属性值或 EAV。有些人讨厌它,有些人则看到它设计中的内在美。设计没有问题,只要经过深思熟虑并正确实施即可。
人们与 EAV 相关的一些更常见的“问题”是:
好的参考比比皆是:
https://softwareengineering.stackexchange.com/questions/93124/eav-is-it-really-bad-in-all-scenarios
SQL 上的属性和值表 - 这是一个好习惯吗?
将数据库从 EAV 结构移植到更典型的关系设计将非常复杂。任何和所有涉及数据的代码都可能需要更改。您可以在现有表上使用触发器,以允许您将代码从 EAV 模型缓慢移植到关系模型中,或者您可以在重新建模的数据上添加一系列视图以支持报告或其他只读方面转换为关系模型后的客户端应用程序。