维护''项目到群组的关系"在SQL Server中

时间:2013-01-30 06:37:06

标签: sql-server

我使用两个表来维持Items-Groups关系。

我有items表,其中有两列ItemNameGroups

另一个表格为Group,其中包含GroupName

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

目前,我将GroupName追加到Groups列,在查询没有任何群组时,我在查询位置使用%Groups%

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

代替Group中的外键,使用另一个表ItemGroupMapping(ItemId FK, GroupId FK)

另外,将主键GroupId添加到Group可能是一个不错的选择。不错的数据库设计。

答案 1 :(得分:1)

不要尝试在一列(*)中存储多个项目。

而是创建3个表 - ItemsGroupsItemGroupsItemGroups将为项目所属的每个组存储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有一个数据结构,用于包含多个项目。它没有数组,列表,字典等。它只有一个结构。它被称为桌子。如果你使用这个结构,事情就会好起来的。如果你试图使用例如伪造其他类型的结构,事情就不会那么好用了。字符串值存储在单个列中。