单表列是指多个主键

时间:2016-08-03 18:08:20

标签: database database-design

我需要在一列中存储多个值。

例如,我正在创建保存用户首选项的表

e.g。

| user_id | cities     | countries  |
|---------|------------|------------|
| 1       | 10, 11, 23 | 21, 34     |

因为我不能将它们存储为数组(或者不喜欢存储为数组,即使它是可用的 - 由于维护和性能原因 - 以及更好的RDMS设计),我必须创建一个像这样的映射表

| user_id | type    | reference_id |
|---------|---------|--------------|
| 1       | CITY    | 10           |
| 1       | CITY    | 11           |
| 1       | CITY    | 23           |
| 1       | COUNTRY | 21           |
| 1       | COUNTRY | 34           |

此列中的参考ID指的是城市,国家等主表格

我看到的问题是

  • 我无法对城市或国家/地区表格进行FK参考,因为单个reference_id列可能指城市或国家/地区取决于类型
  • 由于我无法拥有FK,因此无法保证我们无法获取脏数据

有没有更好的方法?

注意:

  • 我已将城市/国家/地区作为样本,但我需要有大约20个列,可以有多个值,例如城市或国家/地区
  • 将来我可能会介绍一些布尔喜好,例如"你是否喜欢旅行"所以我可能想把TYPE存储为" TRAVEL"和referece_id为0表示是1表示否;肯定不会有任何参考

2 个答案:

答案 0 :(得分:0)

您可以创建位置表{LocationId,locationType(city / country)} 然后,每次向城市或国家/地区表添加新记录时,首先将其添加到位置表,然后根据相应的cityId(或countryId)将其添加到城市(或国家/地区)表中,该位置与位置表中的LocationId相同。

然后在首选项表和位置表之间创建FK,并将城市和国家/地区表之间的[0或1] FK关系添加到位置表中。 (City和COuntry表格中的每个记录必须位于Location表中,但不能相反。

enter image description here

答案 1 :(得分:0)

你是说你想要一个通用数据表,而不是20个强制执行RI的查找表?在大型系统上,数据将存储在多个表中,而不是使用分隔符来分隔值,然后在另一个表中将它们爆炸出来,从而引入了强制执行RI的问题。如果您正在存储非常通用的值,例如代码/描述对,则只需要一个codeSetID字段来标识哪些代码属于哪些代码集。