【问题标题】:What is a good approach in creating a non-NoSQL, relational multi-schema database?创建非 NoSQL 关系多模式数据库的好方法是什么?
【发布时间】:2014-01-30 16:11:37
【问题描述】:

考虑一种情况,数据库表的架构可能会发生变化,即字段、字段数量和这些字段的类型可能会因客户端 ID 等原因而有所不同。

Users 表为例。通常我们会在一个水平表中表示它,其中包含以下字段:

  • 名字
  • 姓氏
  • 年龄

但是,正如我所提到的,每个客户可能有不同的要求。

我在想,要在 SQL Server 等关系数据库中表示Users 的多模式方法,这将使用两个表来完成:

  1. UsersFieldNames - {FieldNameId, ClientId, FieldName, FieldType}
  2. UsersValues - {UserValueId, FieldNameId, FieldValue}

要检索数据(首先使用 EntityFramework DB),我在考虑数据透视表,使用 LINQ Extentions - Pivot Extensions 之类的东西可能会有用。

我想知道可以满足此要求的任何其他方法。

我问这个问题是出于我自己的好奇心,因为我记得过去出现过类似的对话,并且与 this 提出的问题有关。

谢谢。

【问题讨论】:

    标签: sql-server relational-database database-schema


    【解决方案1】:

    虽然我认为 NoSQL 数据库最适合此,但我曾经尝试过类似的方法。

    有一个类似 METATABLES 的表,像这样

    METATABLE = {表名,字段名}

    还有一个,

    ACTUAL_DATA ={table_name, field_name, actual_data_id, float_value, string_value, double_value, varchar_value}

    在actual_data 中,字段table_name 和field_name 将是外键,指向METATABLES。在 METATABLES 中,您可以定义每个客户需要的特定字段。 ACTUAL_DATA 表保存这些字段的实际值,存储在适当的值字段中,具体取决于数据类型(如果字段值是字符串,它将存储在 string_Value 字段中)。

    不过,这种方法可能不是最有效的。希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      我认为让架构不同是错误的。它通常是您想要成为标准的东西。

      在这种情况下,您可能拥有具有不同属性的用户。在用户表中,您存储所有用户共有的属性:

      USER {id(primary key), username, first, last, DOB, etc...}

      注意:年龄是不应该存储的东西,应该计算出来。

      那么你可以有一个 USER_ATTRIBUTE 表:

      {userId,key,value}

      因此,用户可以拥有多个彼此不相关的属性,而无需更改架构。

      更改架构通常会破坏应用程序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-04
        • 1970-01-01
        • 2010-12-21
        • 2015-04-03
        • 1970-01-01
        • 1970-01-01
        • 2012-12-26
        相关资源
        最近更新 更多