3

我需要在预订软件中实现自定义字段。我需要扩展一些表,例如,包含具有动态属性的用户组。

而且,每个产品都可以有自定义字段的产品表(理想情况下,这些字段可以嵌套)。

我已经对 EAV 进行了一些搜索,但我读到了很多负面评论,所以我想知道哪种设计用于此类事情。

我了解使用 EAV 会导致许多连接对产品页面进行排序,但我不想在每次创建属性时更改组/产品表。

注意:我使用 Innodb

4

3 回答 3

2

我正在开发一个完全基于 EAV 的项目。我同意 EAV 使事情变得复杂和缓慢,但它有其自身的优势,例如我们不需要更改数据库结构或添加新属性的代码,并且我们可以在数据库表中的数据之间建立层次结构。

如果我们在所有地方都使用 EAV,系统可能会变得非常慢。

但是,如果使用得当,Eav 非常有用。我永远不会基于 EAV 设计我的整个数据库。我将划分常用和有用的属性并将它们放在平面表中,而对于附加属性(可能需要根据客户或各种要求进行更改),我将使用 EAV。

通过这种方式,我们可以拥有 EAV 的优势,其中包括您想要的灵活性,而不会遇到太多麻烦。

这只是我的建议,可能有更好的解决方案。

于 2012-10-23T09:40:41.553 回答
2

唯一好的解决方案几乎是您不想做的事情,每次创建属性时都更改组/产品表。是的,这很痛苦,但它会保证数据的完整性和更好的性能。

如果您不想这样做,您可以使用 创建一个表TableName, FieldName, ID and value,并按住让我们说:

TableName='Customer',FieldName='Address',ID =1(客户ID),Value ='customers address'

但正如你所说,它需要大量的连接。我认为这不是一个好的解决方案,我已经看过但不会真正推荐它。只是展示,因为它是一种可能的解决方案。

另一种解决方案是在您的表上添加几个预定义的列column1, column2, column3,等等,并根据需要使用它们。这是一个和前一个一样糟糕的解决方案,但我见过使用它的主要 ERP。

伙计,根据经验,您在该领域发现的任何东西都将是一项巨大的工作,不值得实施,您必须维护它的头痛将比将字段添加到表中更大。保持简单和正确。

于 2012-10-23T09:32:44.170 回答
0

您可以通过添加至少 2 个以上的表来做到这一点。一个表将包含属性唯一键 (attr_id) 和属性值,例如属性名称和业务逻辑所需的其他内容。

第二个表将作为您的产品表和属性表之间的连接,并且应该具有以下字段:

(id, product_id, attr_id)

这样,您可以根据需要添加任意数量的动态属性,并且您的数据库模式将是未来的证明。

现在查询的唯一缺点将必须添加另外 2 个要连接的表。

于 2012-10-23T09:34:40.680 回答