自定义字段/属性模型

时间:2012-10-23 09:22:22

标签: mysql sql

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

但也是一个产品表,其中每个产品都可以包含自定义字段(理想情况下,这些字段可以嵌套)。

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

我知道使用EAV会导致很多连接对产品页面进行排序,但每次创建属性时我都不想改变组/产品表。

注意:我使用Innodb

3 个答案:

答案 0 :(得分:2)

唯一好的解决方案就是你不想做什么,每次创建一个属性时改变组/产品表。它是一种痛苦,是的,但它将保证数据的完整性和更好的性能。

如果您不想这样做,可以创建一个包含TableName,FieldName,ID和值的表,并保持让我们说:

  

TableName ='Customer',FieldName ='Address',ID = 1(客户ID),值   ='客户地址'

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

另一种解决方案是在表上添加几个预定义的列,如column1,column2,column3等,并根据需要使用它们。它的解决方案与前一个解决方案一样糟糕,但我已经看到了使用它的主要ERP。

Mate,根据经验,你会发现任何东西都是一个巨大的工作,并且不值得实施,你必须维持它的头痛比将你的字段添加到你的桌子更大。保持简单和正确。

答案 1 :(得分:2)

我正在完成一个完全基于EAV的项目。我同意EAV使事情复杂而缓慢,但它有自己的优点,比如我们不需要更改数据库结构或代码来添加新属性,我们可以在数据库表中的数据之间建立层次结构。

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

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

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

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

答案 2 :(得分:0)

您可以通过添加至少2个表来完成此操作。 一个表将包含属性唯一键(attr_id)和属性值,如属性名称和业务逻辑所需的其他内容。

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

(id, product_id, attr_id)

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

现在查询的唯一缺点是必须再添加2个表来加入。