我将对这个问题的大部分意见提出相反的意见。虽然EAV是所有的原因,您可以在SO和DBA.SE等在其他地方彻底解释多次,但是有一个真正常见的应用程序,EAV的大多数事情在很大程度上是无关紧要的,少数)EAV的优势非常密切。该应用程序是在线产品目录。
EAV的主要问题是它不让数据库做它真正做得很好的事情,这有助于通过将它们安排在模式中来为不同实体的信息的不同属性提供适当的上下文。拥有架构在访问,解释和实施数据的完整性方面带来许多优点。
关于产品目录的事实是,产品的属性几乎完全与目录系统本身无关。产品目录系统(最多)做出三件事情,产品属性。
>以最终用户的形式显示列表中的产品属性:{attribute name}:{attribute value}。
>在比较网格中显示不同产品的属性相互排列的多个产品的属性(产品通常是列,属性通常是行)
>根据特定的属性/值组合驱动某些东西(例如定价)的规则。
如果您的所有系统都是在语义上与系统无关的信息,那么该信息的模式基本上是无益的。实际上,该模式会阻碍在线产品目录中,特别是如果您的目录具有多种不同类型的产品,因为您始终不得不回到模式来修补它,以允许新的产品类别或属性类型。
由于它的使用方式,产品目录中的属性值的数据类型不一定非常重要。对于某些属性,您可能需要施加约束,例如“必须是数字”或“必须来自此列表{…}”。这取决于您的目录的属性一致性是多么重要,以及您希望实现的精细程度。看几个在线零售商的产品目录,我会说最多的是准备交换简单的一致性。
是的,EAV是邪恶的,除非它不是。