2012-10-23 143 views
3

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

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

我已经做了一些关于EAV的搜索,但我读了很多负面评论,所以我想知道哪种设计用于这种事情。

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

注:我使用InnoDB

+0

AFAIK,没有银弹。这完全取决于折衷。关键问题是你将如何处理这些数据。 “无限灵活”的数据需要同样无限灵活的用户界面和大量的用例。我将从用例开始,然后尽可能地在一个固定的模式中实现,尽可能增加EAV扩展,并针对例如XML字段进行权衡。 –

+0

另外,根据经验,可以使用数据库元数据生成许多与EAV相关的查询。将其添加到等式中。 –

+0

谢谢。是的,应该可以搜索具有给定属性的产品,但它在创建“动态表”时会增加一些复杂性 – student310

回答

2

唯一好的解决方案是非常你不要有什么想做的事情,改变组/产品表,每个表创建一个属性的时间。这是一个痛苦,但是它会保证数据的完整性和更好的性能。

如果SONT要做到这一点,你可以创建一个表,表名,字段名,ID和值,并保持让说:

表名=“客户”,字段名=“地址”,ID = 1(用户ID),价值 = '客户解决'

,但正如你所说的,它需要连接的负载。我不认为这是一个很好的解决方案,我见过它,但不会真的推荐它。只是表现得很好,这是一种可能的解决方案。

另一种解决方案是在表格中添加几个预定义的列,如column1,column2,column3等,并将它们用作必要条件。它的解决方案与前一个一样糟糕,但我看到了使用它的主要ERP。

配合,根据经验,任何你会发现这将是一个巨大的工作,不会值得实施,你将不得不维护它的头痛将比你的表添加到你的领域更大。保持简单和正确。

+0

谢谢。我需要看看这个解决方案。我正在阅读另一篇文章,其中有人会谈论每种产品的一张桌子。我认为它避免了有很多空的领域。用这种方法,用户界面看起来像phpmyadmin – student310

+0

每个产品一张桌子?你什么意思? (只是在我的回答中添加了一点点评论) – Diego

+2

http://stackoverflow.com/a/884279/1288927 – student310

0

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

二表将作为您的发言权产品表之间连接属性表,并应具有以下字段:

(id, product_id, attr_id) 

这种方式,你可以根据需要添加尽可能多的动态属性,和数据库架构将是未来的证明。

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

+0

是不是EAV? –

2

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

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

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

这样我们就可以拥有EAV的优点,其中包括灵活性,而不会产生麻烦。

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

相关问题