Sql server 如何在SQL Server 2008中在单个列上存储项目列表

Sql server 如何在SQL Server 2008中在单个列上存储项目列表,sql-server,tsql,Sql Server,Tsql,我正在寻找一种在SQLServer2008表中存储用户信息的有效方法 在设计中,所有用户数据将存储在单个表中的一系列列中,但其中一列需要存储值列表,例如:'column1'将存储用户名,'column2'将存储用户ID,'column3'将存储随时间变化的项目列表 我希望避免为每个用户将这些信息放在不同的表中,因为这需要数据库中有很多表 此'column3'应使用什么数据类型?我应该使用完全不同的方法吗 我看到在SQL Server上我们可以使用,但这似乎只适用于临时存储 谢谢。我想你需要一种不

我正在寻找一种在SQLServer2008表中存储用户信息的有效方法

在设计中,所有用户数据将存储在单个表中的一系列列中,但其中一列需要存储值列表,例如:
'column1'
将存储
用户名
'column2'
将存储
用户ID
'column3'
将存储随时间变化的项目列表

我希望避免为每个用户将这些信息放在不同的表中,因为这需要数据库中有很多表

'column3'
应使用什么数据类型?我应该使用完全不同的方法吗

我看到在SQL Server上我们可以使用,但这似乎只适用于临时存储


谢谢。

我想你需要一种不同的方法

--create a reference table 
create table attributes
(opt smallint, descr nvarchar(40))
go
--insert integer rep. of bit-positions: 1,2,4,8,16,32...  
insert into attributes values (1,'KD')
insert into attributes values (2,'FSC')
insert into attributes values (4,'S1S')
insert into attributes values (8,'QTR')
go
如果您试图对多对一关系建模,那么应该使用一个带有外键约束的额外表

如果您试图对多对多关系进行建模,可以使用三个表,其中一个表是将其他两个表链接在一起的表


如果你正在寻找一个灵活的模式,你可能需要考虑一种方法。这种设计有其独特之处,但我认为它比在单个字段中存储大量不同类型的值要好。

您也可以使用XML类型。查看更多信息。

通常在列中存储多个值表示数据库设计不佳。这使得基于单个列中的条件高效地选择行变得非常困难。话虽如此,如果你真的只需要在每行的基础上选择这些值,那么就考虑使用XML作为./P> 我希望避免为每个用户将这些信息放在不同的表中,因为这需要数据库中有很多表

如果我理解正确,并且您希望为每个用户存储一个项目列表,那么它只需要多一个表,而不是“很多”。创建一个主表(Users)和一个详细表(UserItems),并在UserItems中添加一个外键列,该列将指向所属用户记录


这是在关系数据库中设计实体关系的正确方法。

如果您使用的是PHP或其他功能相同的语言,则可以将值存储为分隔列表,用特殊字符(如管道(“|”)分隔,如果您确定它们不会出现在存储的实际值中,则可以使用逗号。然后将值提取出来将很容易(至少在PHP中)-只需执行
$var=explode(“定界字符”,“输入字符串”)
。最后,$var是一个值数组。
定界字符将是您的管道或您想要使用的任何东西


希望这有帮助(至少有一些)

看起来您的需求至少是为用户存储用户ID、用户名和动态项目列表。您需要一个能够保存所需信息的模式。一个简单的模式可以允许非常快速的检索,而复杂的模式可以内置很多完整性。两种不同的设计都有赞成和反对的,根据您的需求,一种模式设计会比另一种更好

这里有一些你可以考虑的例子(用户-项目模式关系):

多-多关系模式

  • 要求用户至少有一个项目列表
  • 如果xml格式发生更改,则需要进行许多更新
  • 用户可以拥有与其他用户相同的项目
  • 将为用户获取项目列表,而无需任何联接

    用户
    用户ID
    用户名
    项目(xml数据类型)

一对多关系模式示例

  • 要求用户至少有一个项目列表
  • 限制具有相同唯一项的用户

    用户
    用户ID
    用户名 ListItemID

    列表
    ListID
    ListItemID
    ItemID
    项目

一对多关系模式示例

  • 限制具有相同唯一项的用户
  • 不要求用户拥有一个或多个项目

    用户
    用户ID
    用户名

    项目
    ItemID
    用户ID
    项目

多-多关系模式示例

  • 允许用户与其他用户共享相同的项目
  • 检索信息可能非常快
  • 大量冗余信息。用户和项目信息被多次存储
  • 如果用户的详细信息发生更改,则需要更新一条或多条记录
  • 如果项目的详细信息发生更改,则需要更新一条或多条记录

    用户项目
    UserItemID
    用户ID
    用户名
    ItemID
    项目

多-多关系模式示例:

  • 这允许用户共享相同的唯一项
  • 不要求用户拥有项目列表
  • 它需要连接3个表以获取有关用户拥有的项目的信息
  • 如果用户信息发生更改,则只需更新一条记录
  • 如果项目的详细信息发生更改,则只需更新一条记录
  • 如果用户项目列表发生更改,更改的数量将是所需的更新/删除/插入的数量

    用户
    用户ID 用户名

    项目列表
    ItemListID
    用户ID
    项目ID

    项目
    ItemID
    项目

多-多关系模式示例:

  • 这允许用户共享相同的唯一项
  • 需要
    -- This returns a single description value for all combinations
    create function getAttribute(@t smallint) returns nvarchar(80) 
    as
    begin
       RETURN
       STUFF((select  descr+' ' from attributes where 
       (opt&@t=1 or opt&@t=2 or opt&@t=4 or opt&@t=8 OR opt&@t=16) 
       FOR XML PATH('')
        ),1,0,'')
     end
     go
    
    ALTER table example add attr_descr as dbo.getAttribute(attr)
    
    select dbo.getAttribute(5)