0

我正在使用两个表来维护Items-Groups关系。

我有一个items表,它将有两列ItemNameGroups.

另一个表Group有一个列GroupName

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

目前我正在追加GroupNametoGroups列,同时查询我%Groups%在 where 查询中使用的组。

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

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

4

2 回答 2

1

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

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

以上假设项目与组的一对多关系,如果它是多对多关系:

而不是 Group 中的外键,有另一个 table ItemGroupMapping(ItemId FK, GroupId FK)

将主键 GroupId 添加到 Group 可能是一个好的数据库设计的好主意。

于 2013-01-30T06:54:30.667 回答
1

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

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

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 具有一种设计用于包含多个项目的数据结构。它没有数组、列表、字典等。它只有一个结构。它被称为表。如果你使用这种结构,一切都会很好。如果您尝试使用例如存储在单个列中的字符串值来伪造某种其他类型的结构,那么事情就不会那么顺利了。

于 2013-01-30T07:46:26.740 回答