gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:12:19 25 4
gpt4 key购买 nike

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

我现在看到3个选项。

  • 要将一个表存储在不同字段中,例如:
    实体ID属性ID字符串值数字值日期值。
  • 将不同类型的属性的值存储在不同的表中,例如string_attribute_values,numeric_attribute_values,date_attribute_values。
  • 将所有类型的值存储为VARCHAR,但是此变体似乎是不合适的,因为很难通过数字值(它们将作为字符串进行比较)进行过滤,例如,在仅数字的字段中输入字母应该。

  • 我想我现在需要:字符串,数字(整数)和日期类型,但其他类型可能稍后出现。

    谢谢。

    最佳答案

    在RDBMS社区中,EAV是一种反模式。为了通过使用EAV获得“无限的灵活性”,将数据重新构造为记录/对象所需的SQL会更加复杂。您还将获得无法使用任何可用的数据完整性工具(外键,检查约束等)的“好处”,随着时间的流逝,这种设计会因自身的负担而崩溃。

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

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

    2.)具体表继承=将 public super class 型列放在每个子类型的表中。当 super class 型没有很多自己的属性,但子类型却有很多属性时,这种方法效果更好。

    3.)单表继承=将所有子类型的列与 super class 型的列一起放置在1个表中。与特定行的子类型无关的列具有NULL值。当每个子类型没有很多唯一属性或多个子类型共享列/属性时,这最适合。

    您可以将这3种混合并匹配一些,但我建议您坚持使用其中一种设计。

    如果您确实需要使用EAV,则如果EAV设计中的数据比例相对较小(与整个数据库相比),则可以在RDBMS中使用XML列。如果将大量数据存储在EAV中,则RDBMS并不是您需要的工具。查看文档/ NoSQL /键值数据库,例如MongoDB,Cassandra等。实现EAV的RDBMS(如果不是很早的话)最终会成为编码梦night。

    给定您提出问题的日期,我很想知道您选择了哪条路线,学到了什么,喜欢/不喜欢的东西等等。

    关于database-design - 如何将不同类型的属性值存储为EAV?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4468533/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com