我有一个这样的表,其中包含添加到数据库中的项目。
目录表示例
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对应的元素
如果我的问题可以理解,有没有更简单的方法呢?
答案 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
列}值。