我一直在寻找一种允许用户定义字段和值(允许无限数量)的数据库解决方案。乍一看,EAV 似乎很合适,但经过一些阅读,我不再确定。
EAV的优点和缺点是什么?
是否有允许用户定义的属性/字段和值的替代数据库方法?
我一直在寻找一种允许用户定义字段和值(允许无限数量)的数据库解决方案。乍一看,EAV 似乎很合适,但经过一些阅读,我不再确定。
EAV的优点和缺点是什么?
是否有允许用户定义的属性/字段和值的替代数据库方法?
这不是一个详尽的答案,而只是关于该主题的几点。
由于问题也带有[sql]
标签,所以我说,一般来说,关系数据库并不特别适合使用EAV模型存储数据。您仍然可以在 SQL 中设计 EAV 模型,但是您将不得不牺牲关系数据库将提供的许多优势。不仅您将无法强制执行参照完整性、对值使用 SQL 数据类型并强制执行强制属性,而且即使是非常基本的查询也会变得难以编写。事实上,为了克服这个限制,一些 EAV 解决方案依赖于数据复制,而不是与相关表连接,正如您可以想象的那样,它有很多缺点。
如果您真的需要无模式设计,“允许无限数量的属性”,您最好的选择可能是使用NoSQL解决方案。尽管 EAV 相对于关系数据库的弱点也适用于 NoSQL 替代方案,但您将获得使用传统 SQL 数据库难以实现的附加功能。例如,通常 NoSQL 数据存储可以比关系数据库更容易扩展,这仅仅是因为它们旨在解决某种可扩展性问题,并且它们故意放弃了使扩展变得困难的功能。
许多云计算平台(例如亚马逊、谷歌和微软提供的那些)都具有基于 EAV 模型的数据存储,其中任意数量的属性可以与给定实体相关联。如果您正在考虑将应用程序部署到云上,您可能会认为这既是一种业务优势,也是一种技术优势,因为大型供应商之间的激烈竞争正在将价值成本比推到非常高的水平,通过不断提升功能并降低财务和实施成本。
看看 posgtres hstore http://www.postgresql.org/docs/9.0/static/hstore.html 这将完全符合您的要求,而没有大多数缺点
Streams Platform提出了基于Streams(实际上是 Domain Model)、Fields和Assignments实体的替代方式。
是否有允许用户定义的属性/字段和值的替代数据库方法?
一种替代方法是根据用户输入更改数据库模式:例如,当用户想要一个新字段时,然后将相应的列添加到数据库中。