Database 表中的引用

Database 表中的引用,database,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为

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

目录表示例

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对应的元素


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

是的,有一种方法可以做到这一点。创建第三个表,其中包含a/B映射。它称为多对多外键关系

您有目录表
(int、varchar(MAX)、varchar(MAX))
或类似表格

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

创建一个usercatalog表:
(int-UserId,int-catalogeid)
,两列上都有一个
主键。然后,UserId列获取
User.Id
的外键,catalogeid表获取
catalog.Id
的外键。这将保留关系并简化查询。这还意味着,如果第22号
目录.Id
不存在,则不能意外地将其作为两者之间的关系插入。这称为引用完整性。SQL Server要求,如果您说“此列必须引用此另一个表”,则SQL Server将要求该关系

创建此项后,为每个选中的
项添加一个条目:即

UserId | CatalogueId
0      | 2
0      | 3
0      | 7
0      | 9
这也允许您在表上使用
JOIN
s以实现更快的查询


此外,与问题无关,您还可以优化现有的
目录
表,并为
目录组
创建另一个表,其中包含您在那里的最后一列(
目录
:汽车、动物)通过当前
目录
表定义中的外键关系引用。这也将节省存储空间并加快SQL Server的工作速度,因为如果您只需要
元素
值,它就不再需要读取
字符串