创建非NoSQL关系多模式数据库有什么好方法?

时间:2014-01-30 16:11:37

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

考虑一种情况,数据库表的模式可能会发生变化,即字段,字段数和这些字段的类型可能会因客户ID而异。

Users表为例。通常我们会在具有以下字段的水平表中表示:

  • 名字
  • 年龄

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

我在考虑在SQL Server这样的关系数据库中表示Users的多模式方法,这可以通过两个表来完成:

  1. UsersFieldNames - {FieldNameId,ClientId,FieldName,FieldType}
  2. UsersValues - {UserValueId,FieldNameId,FieldValue}
  3. 要检索数据(首先使用EntityFramework DB),我正在考虑数据透视表,使用像LINQ Extentions - Pivot Extensions这样的东西可能很有用。

    我想知道满足这一要求的任何其他方法。

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

    感谢。

2 个答案:

答案 0 :(得分:1)

虽然我认为NoSQL数据库最适合这种情况,但我曾经尝试过类似的东西。

有一个名为METATABLES的表,就像这样

METATABLE = {table_name,field name}

和另一个,

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字段中)。

但这种方法可能不是最有效的方法。希望它有所帮助。

答案 1 :(得分:0)

我认为架构变化是错误的。这通常是您想要成为标准的东西。

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

USER {id(主键),用户名,first,last,DOB等...}

注意:年龄不应存储,应计算。

然后你可以有一个USER_ATTRIBUTE表:

{用户id,键,值}

因此,如果没有架构更改,用户可以拥有多个彼此无关的属性。

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