我一直在寻找一种数据库解决方案,允许用户定义的字段和值(允许无限数量)。乍一看,EAV似乎是合适的,但经过一些阅读后我不再确定了。
EAV的优点和缺点是什么?
是否有其他数据库方法允许用户定义的属性/字段和值?
答案 0 :(得分:30)
这不是一个详尽的答案,而只是关于这个主题的几点。
由于问题也标有[sql]
标记,因此我要说,relational databases通常不适合使用EAV模型存储数据。您仍然可以在SQL中设计EAV模型,但您必须牺牲关系数据库可以提供的许多优势。您不仅无法强制执行参照完整性,还可以使用SQL数据类型来实现值并强制执行必需属性,但即使是非常基本的查询也很难编写。事实上,为了克服这个限制,一些EAV解决方案依赖于数据复制,而不是加入相关的表,你可以想象,这些表有很多缺点。
如果你真的需要无模式设计,“允许无限数量的属性”,最好的办法就是使用NoSQL解决方案。尽管EAV相对于关系数据库的弱点也适用于NoSQL替代方案,但您将获得使用传统SQL数据库难以实现的其他功能。例如,通常NoSQL数据存储可以比关系数据库更容易扩展,仅仅因为它们旨在解决某种可伸缩性问题,并且它们故意丢弃使扩展变得困难的功能。
许多云计算平台(例如Amazon,Google和Microsoft提供的平台)都具有基于EAV模型的数据存储,其中可以将任意数量的属性与给定的实体。如果您正在考虑将您的应用程序部署到云中,您可能会将此视为业务优势和技术优势,因为大型供应商之间的激烈竞争将价值成本比率推高到非常高的水平,通过不断推进功能,降低财务和实施成本。
答案 1 :(得分:2)
看看postgres hstore http://www.postgresql.org/docs/9.0/static/hstore.html 如果没有大多数缺点,这将完全符合您的要求
答案 2 :(得分:0)
Streams Platform提出了基于 Streams 的替代方式(实际上,它是域模型),字段和分配实体。
答案 3 :(得分:-9)
是否有其他数据库方法允许用户定义的属性/字段和值?
一种替代方法是根据用户输入更改数据库架构:例如,当用户想要一个新字段时,然后将相应的列添加到数据库中。