今天又出现了如何处理允许用户将自定义字段添加到产品数据库中交付的标准实体模式的问题。我倾向于实际提供一个功能,为用户提供有限的 DDL 功能,以便他们实际上可以将新的自定义字段添加到表中。另一种方法是为自定义字段创建一个单独的表,例如Customers 和CustomersEx,其中只有CustomersEx 可以更改,但这里的更新变得比平常更棘手。我们讨论的最后一个也是最糟糕的选项是提供一个 EAV 表,其中行是实体名称、字段名称、字段值。
哪种方法最好?
今天又出现了如何处理允许用户将自定义字段添加到产品数据库中交付的标准实体模式的问题。我倾向于实际提供一个功能,为用户提供有限的 DDL 功能,以便他们实际上可以将新的自定义字段添加到表中。另一种方法是为自定义字段创建一个单独的表,例如Customers 和CustomersEx,其中只有CustomersEx 可以更改,但这里的更新变得比平常更棘手。我们讨论的最后一个也是最糟糕的选项是提供一个 EAV 表,其中行是实体名称、字段名称、字段值。
哪种方法最好?
添加到现有关系结构的 EAV。SQL Server CAT(客户顾问团队)发布了一份关于此主题的白皮书。虽然是特定于供应商的,但讨论的原则和建议的解决方案适用于大多数 RDBMS:性能和可扩展性语义数据建模的最佳实践
我赞成你的第二个想法。我们做了类似的事情,但将表称为 Attr[ibute] 表,例如 Company、CompanyAttr。属性是我们业务对象(1:M)中的一个集合,NHibernate 处理数据库操作。我们将这些字段显式显示为 UI 中的属性,并且不会尝试将它们显示为表格中的附加字段。
我赞成通过 DDL 向表中添加字段,但该表应该与主表分开。这样,您可以编写对数据库架构的更改脚本,而不会影响用户的自定义字段添加。右连接很容易完成,如果没有自定义字段,您将不需要单独表中的记录。
如果您只想以垂直方式显示数据,EAV 表可能是一个不错的选择。您还可以运行数据透视查询以水平显示它们。