我一直在寻找一个数据库解决方案,允许用户定义的字段和值(允许无限数量).乍一看,EAV似乎是合适的,但经过一些阅读后我不再确定了.
EAV的优点和缺点是什么?
是否有替代数据库方法来允许用户定义的属性/字段和值?
这不是一个详尽的答案,而只是关于这个主题的几点.
由于问题也标记有[sql]
标记,因此,我要说,通常,关系数据库并不特别适合使用EAV模型存储数据.您仍然可以在SQL中设计EAV模型,但您必须牺牲关系数据库可以提供的许多优势.您不仅无法强制执行参照完整性,还可以使用SQL数据类型来实现值并强制执行必需属性,但即使是非常基本的查询也很难编写.事实上,为了克服这个限制,一些EAV解决方案依赖于数据复制,而不是加入相关的表,你可以想象,这些表有很多缺点.
如果你真的需要无模式设计,"允许无限数量的属性",你最好的选择可能是使用NoSQL解决方案.尽管EAV相对于关系数据库的弱点也适用于NoSQL替代方案,但您将获得使用传统SQL数据库难以实现的其他功能.例如,通常NoSQL数据存储可以比关系数据库更容易扩展,仅仅因为它们旨在解决某种可伸缩性问题,并且它们故意丢弃使扩展变得困难的功能.
许多云计算平台(例如亚马逊,谷歌和微软提供的平台)都具有基于EAV模型的数据存储,其中任意数量的属性可以与给定实体相关联.如果您正在考虑将您的应用程序部署到云中,您可能会将此视为业务优势和技术优势,因为大型供应商之间的激烈竞争将价值成本比推向非常高的水平,通过不断推进功能,降低财务和实施成本.