Sql 如何定义数据库中有多个值在另一个表中引用的列?

Sql 如何定义数据库中有多个值在另一个表中引用的列?,sql,database,database-design,Sql,Database,Database Design,我在一个网站上工作,有些功能类似于Stackoverflow 其中之一是它有一个类型的多个项目(在假设中,多个问题) 每个项目都与另一种类型(城市)的多个值相关。(在SO假设中,每个queston都与多个标记相关。标记是表中的条目,即标记) 因此,我的表格是: 城市(Id、名称、IsAcive) MyItems(Id、DisplayText、Acivencies) 在这里,一个myitems条目可以在多个城市中激活 我的问题是我应该如何定义数据库中的acivencies列。以逗号分隔的城市ID

我在一个网站上工作,有些功能类似于Stackoverflow

其中之一是它有一个类型的多个项目(在假设中,多个问题)

每个项目都与另一种类型(城市)的多个值相关。(在SO假设中,每个queston都与多个标记相关。标记是表中的条目,即标记)

因此,我的表格是:

城市(Id、名称、IsAcive)
MyItems(Id、DisplayText、Acivencies)
在这里,一个
myitems
条目可以在多个城市中激活

我的问题是我应该如何定义数据库中的
acivencies
列。以逗号分隔的城市ID或以逗号分隔的城市名称,或位于不同表中的某些位置

这是一个web应用程序,我希望用户能够按城市搜索我的项目。因此,在同一个表中保存cityname/id可能很快

这三种方法中的任何一种都有问题吗

如果这是重复的问题,请将我重定向到正确的问题,我找不到


谢谢

您的数据库中不应该有多值列,事实并非如此

有一个多对多表,其中包含
CityId
ItemId
列作为外键,它们一起是复合主键

Cities(Id, Name, IsAcive)
MyItems(Id, DisplayText)
ItemsActiveInCities(CityId, ItemId)

第三个关联表是标准化方法:

City
(CityId, Name, IsAcive)

Item
(ItemId, DisplayText)

ItemActiveInCity
(ItemId, CityId)


至于为什么在数据库列中存储逗号分隔的值不是一个好主意,请参见以下内容:

所有单词都会说不推荐,因为行/列的交点假定为一个单元格,那么如果您制作了另一个表示该值的列, 例如如果我的项目是一个图书馆,我的任务是以单个顺序列出购买了“小学生数学”和“萨希穆斯林解释”的客户的姓名

这意味着我需要一个单一顺序的图书列表(ID)

解决方案

定义一个类似orderID(主键)的列,但允许重复,
只需
即可
让您以后可以
合并这些行

这很好。但我之所以想把它们放在同一张表中,是因为搜索操作的速度。因为许多搜索将使用城市。@Maheep-你在这里有一个误解。将它们放在一个字段中会比较慢,因为您需要对其进行解析、排序,然后仍然加入到结果中。将其放在单独的表中是正确的关系设计。说到速度,你需要测量和发现瓶颈,而不是猜测它们可能发生在哪里。这很好。但我之所以想把它们放在同一张表中,是因为搜索操作的速度。因为很多搜索将使用城市。请阅读我在答案中添加的链接中Bill Karwin的答案。