我使用两个表来维持Items-Groups
关系。
我有items
表,其中有两列ItemName
和Groups
。
另一个表格为Group
,其中包含GroupName
列
用户将为每个项目添加一个或多个组。然后,用户将查询分配给该组的项目。
目前,我将GroupName
追加到Groups
列,在查询没有任何群组时,我在查询位置使用%Groups%
。
但是如果用户两次添加相同的组,我需要检查并删除。
有没有更好的方法来维持这些关系?
答案 0 :(得分:1)
具有连接的组字段会阻止自动执行数据库完整性并禁止索引,因此某些查询将非常慢。
将主键ItemId添加(或更改)为Items,并在Group中具有外键ItemId。然后,您可以SELECT COUNT(*) FROM Group WHERE ItemId = X
获取分配给项目的组数。
以上假设项目与群组之间存在一对多关系,如果是多对多关系则
代替Group中的外键,使用另一个表ItemGroupMapping(ItemId FK, GroupId FK)
。
另外,将主键GroupId添加到Group可能是一个不错的选择。不错的数据库设计。
答案 1 :(得分:1)
不要尝试在一列(*)中存储多个项目。
而是创建3个表 - Items
,Groups
和ItemGroups
。 ItemGroups
将为项目所属的每个组存储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有一个数据结构,用于包含多个项目。它没有数组,列表,字典等。它只有一个结构。它被称为桌子。如果你使用这个结构,事情就会好起来的。如果你试图使用例如伪造其他类型的结构,事情就不会那么好用了。字符串值存储在单个列中。