代码之家  ›  专栏  ›  技术社区  ›  Daniel Viglione

仅用于配置数据的名称-值对模型

  •  0
  • Daniel Viglione  · 技术社区  · 6 年前

    我读到数据库设计中的名称-值对模型是一种反模式。实际上,您有一个包含两列的表。一列称为“name”,另一列称为“value”。假设您正在管理不同区域的aws配置。数据库结构如下:

    name                                value
    aws.new_york.access_key             jio4j54h
    aws.new_york.site.user              john
    aws.new_york.site.pass              eoiri4iiuh
    aws.los_angeles.access_key          tret55464
    aws.los_angeles.site.user           bob
    aws.los_angeles.site.pass           rtry45yrt
    aws.new_york.access_key             fgfhgf4fdg
    aws.new_york.site.user              edward
    aws.new_york.site.pass              45gfhgfhgf
    

    唯一的用途是检索配置:

    MyApp.config.get('aws.new_york.access_key')
    

    另一种解决方案是使用连接。这将删除重复并允许引用完整性。但它变得很麻烦:

    table_aws有许多table_states,这些table_states有许多table_凭证,这些凭证有access_key、user、pass列。这个indeed删除了重复,但是可以想象嵌套连接的数量可能会增加。

    考虑到我唯一的用例,名称-值对模型模型仍然是反模式还是合适?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Rick James diyism    6 年前

    您正在考虑的反模式可能是实体属性值。您描述的是一个简单的“哈希表”。如果这个表中只有一百行,甚至一千行,就没有问题。

    但是…你真的在描述eav,只是你让它变得更混乱了。

        aws.new_york.access_key 
    

    是真的 aws.new_york 作为“实体”和“访问密钥”作为“属性”。

    通常eav表应该是3列,其中 PRIMARY KEY(entity, attribute) 按顺序。

    如果您的目标只是一个“配置”的存储库,那么您不太可能执行到eav崩溃的地方的查询。

    所以…在做出判断之前,让我们看看您将如何处理数据集。