Sql server 在SQL Server中维护“项目到组关系”

Sql server 在SQL Server中维护“项目到组关系”,sql-server,Sql Server,我使用两个表来维护项目组关系 我有一个items表,它有两列ItemName和Groups 另一个表是具有列GroupName的Group 用户将向每个项目添加一个或多个组。然后,用户将查询分配给该组的项目数 目前,我正在将GroupName追加到Groups列,在查询组数时,我在where查询中使用了%Groups% 但是如果用户两次添加同一组,我需要检查并删除 有没有更好的方法来维护这些关系?有一个连接的组字段会阻止自动执行数据库完整性并禁止索引,因此某些查询会非常慢 将主键ItemId添加

我使用两个表来维护项目组关系

我有一个items表,它有两列ItemName和Groups

另一个表是具有列GroupName的Group

用户将向每个项目添加一个或多个组。然后,用户将查询分配给该组的项目数

目前,我正在将GroupName追加到Groups列,在查询组数时,我在where查询中使用了%Groups%

但是如果用户两次添加同一组,我需要检查并删除


有没有更好的方法来维护这些关系?

有一个连接的组字段会阻止自动执行数据库完整性并禁止索引,因此某些查询会非常慢

将主键ItemId添加或更改为Items,并在组中具有外键ItemId。然后,您可以从ItemId=X的组中选择COUNT*,以获取分配给项目的组数

如果是多对多关系,以上假设项目与组之间存在一对多关系:

使用另一个表ItemGroupMappingItemId FK,GroupId FK代替组中的外键


另外,将主键GroupId添加到组中可能是一个好主意,因为这是一个好的数据库设计。

不要试图在一列中存储多个项*

相反,创建3个表-项目、组和项目组。项目组将为项目所属的每个组存储1行,例如:

CREATE TABLE ItemGroups (
     ItemID int not null,
     GroupID int not null,
     constraint FK_ItemGroups_Items FOREIGN KEY (ItemID) references Items (ItemID),
     constraint FK_ItemGroups_Groups FOREIGN KEY (GroupID) references Groups (GroupID),
     constraint PK_ItemGroups PRIMARY KEY (ItemID,GroupID)
)
注意,通过在ItemID、GroupID上添加主键,我们避免了重复发生,无需进一步的工作

*SQL有一个用于包含多个项的数据结构。它没有数组、列表、字典等。它只有一个结构。它被称为表。如果使用这种结构,情况会很好。如果你试图使用其他类型的结构(例如,存储在一列中的字符串值),情况就不太好了