0

我喜欢entity-attribute-value的东西,因为我可以添加新字段并在外表行被删除时自动删除这些行,但我不喜欢这样的事实,即我无法实施数据类型。选择查询很复杂。什么是适合存储动态字段的表结构?

是否有更好的方法不涉及为每个属性创建表?

如果我用各种可能的属性创建一个非常大的表,即使大多数行在大多数列上都有NULL,该表是否占用空间?

回答

1

您可以使用多个值字段在EAV模型中强制执行数据类型。这有点棘手,因为您需要另一列来指定类型,然后使用附加约束来指定只填充一个值并且它与类型匹配。

在大多数数据库中,您可以使用检查约束来处理此问题。

此外,您可以只使用一个字符串值,然后使用检查约束来强制执行字符串内容。这通常是足够的。这些约束可以很好地使用支持它们的数据库中的正则表达式。

至于你的第二个问题。每行将占用实体/属性列的空间。 NULL值是否占用任何空间取决于数据库,但该空间通常很小。

+0

谢谢!我做了更多的搜索,我找到了另一种方式 - 子类型 - http://stackoverflow.com/questions/3579079/how-can-you-represent-inheritance-in-a-database/3579462。它需要修改架构,但至少我可以在所有表​​中保留相同的ID。你认为这是一个很好的替代eav? – thelolcat

+0

@thelolcat。 。 。更好的解决方案取决于“要求”。如果你正在使用Postgres,你也可以考虑表继承。 –

相关问题