SQL 2008:为每种数据类型使用单独的表以返回单行

时间:2010-04-13 06:44:56

标签: sql tsql rows coalesce

我认为这次我会变得灵活,让用户决定希望在他们的数据库中存储哪些联系信息。理论上,它看起来像一行包含,例如;姓名,地址,邮政编码,X类,Listitems A.

示例
FieldType 表定义用户可用的数据类型:

FieldTypeID, FieldTypeName, TableName
1,"Integer","tblContactInt"
2,"String50","tblContactStr50"
...

用户在 FieldDefinition 表中定义他的字段:

FieldDefinitionID, FieldTypeID, FieldDefinitionName
11,2,"Name"
12,2,"Address"
13,1,"Age"

最后,我们将实际的联系人数据存储在不同的表中,具体取决于其数据类型。 主表,仅包含ContactID

tblContact

ContactID
21
22

tblContactStr50

ContactStr50ID,ContactID,FieldDefinitionID,ContactStr50Value
31,21,11,"Person A"
32,21,12,"Address of person A"
33,22,11,"Person B"

tblContactInt

ContactIntID,ContactID,FieldDefinitionID,ContactIntValue
41,22,13,27

问题:是否可以将这些表的内容分成两行,如下所示:

ContactID,Name,Address,Age
21,"Person A","Address of person A",NULL
22,"Person B",NULL,27

我已经研究过使用COALESCE和Temp表,想知道这是否可能。即使它是:也许我只会增加复杂性,同时牺牲性能以获得数据存储和用户定义选项的好处。

您怎么看?

1 个答案:

答案 0 :(得分:1)

我认为这不是一个好方法,因为:

  • 简单插入1个记录的联系人突然变为n个插入。例如如果为联系人存储varchar,nvarchar,int,bit,datetime,smallint和tinyint数据,那么在数据类型特定表中插入7,为主标题记录+1,
  • 同样,查询将自动引用7个表,其中涉及6个JOIN以获取完整的详细信息

我个人认为最好采用不那么“通用”的方法。保持简单。

<强>更新 问题是,你真的需要这样灵活的解决方案吗?对于联系人数据,您始终希望能够存储至少一组核心字段(地址行1-n,名字,姓氏等)。如果您需要一种方法让用户在该标准数据集之上存储自定义/用户可定​​义数据,这是一个常见的要求。各种选择包括:

  • 主Contacts表中的XML列,用于存储所有用户定义的数据
  • 包含键值对数据的1个额外表格,有点像您最初谈到的但程度要小得多!这将包含联系人的密钥,自定义数据项名称和值。

这些已经在此处讨论过,所以值得深入研究这个问题。但是,在看了之后似乎无法找到我记得的问题!

找到一些讨论键值方法的优点/缺点,以节省重复:
Key value pairs in relational database
Key/Value pairs in a database table