我一直在寻找一种数据库解决方案,允许用户定义字段和值(允许无限数量).乍一看,EAV似乎很合适,但读了一些之后,我不再确定了.

EAV的优点和缺点是什么?

Is there an alternative database method to allow user defined attributes/fields and values?

推荐答案

这不是一个详尽的回答,只是这个主题的几个要点.

由于这个问题也用[sql]标记,我想说,一般来说,relational databases不是特别适合使用EAV模型存储数据.您仍然可以用SQL设计EAV模型,但您将不得不牺牲关系数据库提供的许多优势.您不仅不能强制引用完整性、对值使用SQL数据类型和强制强制属性,而且即使是最基本的查询也可能变得难以编写.事实上,为了克服这一限制,几个EAV解决方案依赖于数据复制,而不是连接相关表,正如您可以想象的那样,这有很多缺点.

如果您确实需要无模式设计,"允许无限数量的属性",那么您最好的 Select 可能是使用NoSQL个解决方案.尽管EAV相对于关系数据库的弱点也适用于NoSQL替代方案,但是您将获得传统SQL数据库难以实现的附加功能.例如,通常NoSQL数据存储的伸缩性比关系数据库容易得多,原因很简单,因为它们旨在解决某种可伸缩性问题,而且它们故意删除了使伸缩性变得困难的特性.

许多云计算平台(例如由AmazonGoogleMicrosoft提供的平台)以基于EAV模型的数据存储为特征,其中任意数量的属性可以与给定实体相关联.如果您正在考虑将您的应用程序部署到云上,您可能会将其视为业务优势和技术优势,因为大型供应商之间的激烈竞争通过不断提高功能和降低财务和实施成本,将价值成本比推到了非常高的水平.

Database相关问答推荐

位置运算符($)工作不正确

如何在Ballina中的事务失败时回滚缓存插入操作

UML 类图中关联的复杂规则

如何将初始数据放入数据库

如何决定使用数据库事务

优雅地处理 EJB/JPA 环境中的约束冲突?

TSQL - 表值函数中的 If..Else 语句 - 无法通过

操作错误:FATAL: database "django" does not exist

使 H2 将引用的名称和未引用的名称视为相同

每个请求可以多次查询 MongoDB 吗?

无法启动 MongoDB:Windows 中的系统错误 1067

将 Redis 数据同步到 MySQL 的最佳策略是什么?

将实体框架中的字符串列映射到枚举

Tornado 的非阻塞 ORM?

寻找示例数据库设计的好方法

我应该将用户 ID 公开吗?

cURL 和 PHP 显示1

日期格式的 Oracle SQL 查询

如何使用 JPA 注释创建连接表?

Hibernate hbm2ddl.auto 默认值