我需要在预订软件中实现自定义字段。我需要扩展一些包含例如具有动态属性的用户组的表。
但也是一个产品表,其中每个产品都可以包含自定义字段(理想情况下,这些字段可以嵌套)。
我已经对EAV进行了一些搜索,但我读了许多负面评论,所以我想知道哪种设计可用于此类事情。
我知道使用EAV会导致很多连接对产品页面进行排序,但每次创建属性时我都不想改变组/产品表。
注意:我使用Innodb
答案 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个表来加入。