Database design 如何将不同类型属性的值存储为EAV?

Database design 如何将不同类型属性的值存储为EAV?,database-design,entity-attribute-value,Database Design,Entity Attribute Value,您能告诉我如何将不同类型的属性值存储为EAV吗 我现在看到3种选择 要在一个表中存储不同字段,请执行以下操作: 实体\ id属性\ id字符串\数值\数值日期\数值 在不同的表中存储不同类型属性的值,例如字符串属性值、数字属性值、日期属性值 将所有类型的值存储为VARCHAR,但这个变量似乎不合适,因为很难进行过滤,例如,通过数值(它们将作为字符串进行比较)进行过滤,例如,让我们在只有数字的字段中输入字母 我想我现在需要:string、numberic(整数)和date类型,但以后可能会出现其他

您能告诉我如何将不同类型的属性值存储为EAV吗

我现在看到3种选择

  • 要在一个表中存储不同字段,请执行以下操作: 实体\ id属性\ id字符串\数值\数值日期\数值
  • 在不同的表中存储不同类型属性的值,例如字符串属性值、数字属性值、日期属性值
  • 将所有类型的值存储为VARCHAR,但这个变量似乎不合适,因为很难进行过滤,例如,通过数值(它们将作为字符串进行比较)进行过滤,例如,让我们在只有数字的字段中输入字母
  • 我想我现在需要:string、numberic(整数)和date类型,但以后可能会出现其他类型


    谢谢。

    在RDBMS社区中,EAV是一种反模式。对于使用EAV获得的“有限的灵活性”,将数据重组为记录/对象所需的SQL要复杂得多。您还可以从无法使用任何可用的数据完整性工具(外键、检查约束等)中获得“好处”。随着时间的推移,此设计会因自身的重量而崩溃

    如果您有一个用例,其中数据元素是超级类型/子类型关系的一部分,但变化不大,则根据您的需要对表进行建模:

    1.)类表继承=具有公共父级的特定子类型表。当超级类型和子类型都有大量的唯一属性时,这是最好的

    2.)混凝土表继承=在每个子类型的表中放置公共超级类型列。当超级类型没有许多自己的属性,但子类型有很多属性时,这种方法效果更好

    3.)单表继承=将所有子类型的列与超级类型的列一起放在1个表中。不属于特定行的子类型的列具有空值。当每个子类型没有许多唯一属性或多个子类型共享列/属性时,这种方法最为有效

    你可以将这三种颜色混合搭配一下,但我建议你还是选择其中一种

    如果您确实需要使用EAV,那么如果EAV设计中的数据比例相对较小(与整个数据库相比),那么您可以在RDBMS中使用XML列。如果您的很多数据都存储在EAV中,那么RDBMS就不是您需要的工具。查看文档/NoSQL/Key-Value数据库,如MongoDB、Cassandra等。实现EAV的RDBMS,如果不是早期的,最终会成为编码噩梦


    考虑到您的问题日期,我很想知道您选择了哪条路线,学到了什么,您喜欢/不喜欢什么,等等。

    选项3在排序时也会给您带来问题,更不用说必须将每个值从varchar转换为适当类型的性能影响了。我们正在尝试我们的第一个EAV设计,我们将使用选项2。我也尝试使用选项2。类表、对照表和单表继承不适用于我的情况。使用XML也是反模式的(即使有1NF,也存在数据完整性和搜索方面的问题)。现在我尝试在这个系统中使用EAV来完成它的一小部分。为了存储EAV的值,请针对不同的类型使用不同的表:字符串、日期、数字。当然,EAV也会带来一些困难,但坦率地说,我现在没有其他选择。我找了一个mongodb,couchdb,但没有发现它对我的情况有多大帮助。我感谢你的关注。在RDBMS中EAV的使用越有限,从长远来看,您的情况就越好。关键是要睁大眼睛进入。还可以查看本页右侧相关列表中的一些帖子。外面有很多意见。