SQL 2008:对每个数据类型使用单独的表来返回单行

SQL 2008:对每个数据类型使用单独的表来返回单行,sql,tsql,rows,coalesce,Sql,Tsql,Rows,Coalesce,我想这次我会灵活一些,让用户决定希望在他们的数据库中存储什么联系信息。理论上,它看起来像一行,包含,例如;姓名、地址、邮编、类别X、列表项A 示例 定义用户可用数据类型的FieldType表: FieldTypeID, FieldTypeName, TableName 1,"Integer","tblContactInt" 2,"String50","tblContactStr50" ... 用户可在FieldDefinition表中定义其字段: 最后,我们根据其数据类型将实际联系人数据存储在

我想这次我会灵活一些,让用户决定希望在他们的数据库中存储什么联系信息。理论上,它看起来像一行,包含,例如;姓名、地址、邮编、类别X、列表项A

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

FieldTypeID, FieldTypeName, TableName
1,"Integer","tblContactInt"
2,"String50","tblContactStr50"
...
用户可在FieldDefinition表中定义其字段:

最后,我们根据其数据类型将实际联系人数据存储在单独的表中。 主表,仅包含ContactID

TBL联系人:

tblContactStr50:

TBL联系人:

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

ContactID,Name,Address,Age
21,"Person A","Address of person A",NULL
22,"Person B",NULL,27
我已经研究过使用COALESCE和Temp表,想知道这是否可能。即使是这样:也许我只是为了数据存储和用户定义选项的好处而增加了复杂性,同时牺牲了性能


你觉得怎么样?

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

  • 一个触点的1条记录的简单插入突然变成n条插入。e、 g.如果您为联系人存储varchar、nvarchar、int、bit、datetime、smallint和tinyint数据,则在数据类型特定的表中有7个插入,主标题记录为+1
  • 同样,一个查询将自动引用7个表,其中涉及6个联接,以获取完整的详细信息
我个人认为最好采用一种不太“通用”的方法。保持简单

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

  • 用于存储所有用户定义数据的主联系人表中的XML列
  • 1个额外的表,包含键值对数据,有点像您最初提到的,但程度要小得多!这将包含联系人的键、自定义数据项名称和值
这些都已经在这里讨论过了,所以值得为这个问题挖掘。在快速浏览之后,似乎找不到我所记得的问题

找到一些讨论关键值方法优缺点的方法,以避免重复:


嗨,A,我倾向于像你建议的那样保持简单。我对这个问题的复杂性感到有点害怕。如果有人以前没有这样做过,那一定有原因。@Thomas C-Yep,你的直觉是对的。如果你发现自己有这种感觉,这是一个很好的迹象,你应该重新思考你到底想要实现什么。现在我的直觉告诉我,稀疏列是一种方式;)谢谢,我现在很乐意做出正确的设计决策。祝你度过愉快的一天,并向托马斯致意
ContactID
21
22
ContactStr50ID,ContactID,FieldDefinitionID,ContactStr50Value
31,21,11,"Person A"
32,21,12,"Address of person A"
33,22,11,"Person B"
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