表格中的参考文献

时间:2015-04-26 19:08:19

标签: database

我有一个这样的表,其中包含添加到数据库中的项目。

目录表示例

id | element | catalog  
0  | mazda   | car  
1  | penguin | animal  
2  | zebra   | animal  

等...

然后我有一个表,用户从该表中选择项目,并保留对此选择内容的引用

用户表格示例

id | name | age | itemsSelected  
0  | john | 18  | 2;3;7;9

所以我想说的是,如果有ID,我会继续引用用户选择的字符串,但我认为这似乎有点麻烦

因为当我进行查询以获取有关用户的信息时,我得到的是2;3;7;9的字符串,当我真正想要的是与这些ID相对应的项目数组时

现在我得到了ID,我必须拆分字符串,然后运行另一个查询来查找ID对应的元素

如果我的问题可以理解,有没有更简单的方法呢?

1 个答案:

答案 0 :(得分:2)

是的,有办法做到这一点。您创建第三个表,其中包含A / B的映射。它被称为多个到多个外键关系。

您拥有目录(int, varchar(MAX), varchar(MAX))或类似内容。

您拥有用户(int, varchar(MAX), varchar(MAX), varchar(MAX))或类似表格,基本上,删除最后一列,然后创建另一个表格:

您创建了一个 UserCatalogue 表:(int UserId, int CatalogueId),两列都有Primary Key。然后, UserId 列会将外键变为User.Id,而 CatalogueId 表会将外键变为Catalogue.Id。这样可以保留关系并简化查询。这也意味着如果Catalogue.Id数字22不存在,则不能意外地将其作为两者之间的关系插入。 这称为引用完整性。 SQL Server要求,如果您说," 必须引用这个表"然后SQL Server将强制执行关系

创建后,为每个itemsSelected添加一个条目:I.e。

UserId | CatalogueId
0      | 2
0      | 3
0      | 7
0      | 9

这也可以让您在表格中使用JOIN来进行更快查询。

此外,与问题无关,您还可以优化您的Catalogue表格,并为CatalogueGroup创建另一个表格,其中包含您的最后一列(catalog car animal ),它通过您当前的Catalogue表定义中的外键关系引用。这也将 保存 存储空间并加快SQL Server的工作速度,因为如果您只想要string,则不再需要阅读element列}值。