2016-08-03 57 views
0

我需要在一个列中存储多个值。单表列是指多个主键

例如我创建表,其保持用户偏好

例如

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

,因为我无法将它们存储为阵列(或不情愿存储为列,即使它是可用 - 由于维护和性能方面的原因 - 和更好的关系数据库管理系统的设计),我要创建一个这样

| 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存储不存在;这肯定不会有任何引用

回答

0

您可以创建一个定位表{LocationId,的locationType(城市/国家)} 然后每次你添加一个新的记录到城市或国家表,将它添加到位置表首先,根据相应的cityId(或countryId)将其添加到城市(或国家/地区)表中,如同位置表中的LocationId所使用的那样。

然后在首选项表和位置表之间创建FK,并将城市和国家表之间的FK关系[]添加到位置表中的[0或1]。 (在城市和国家表的表中的每个记录必须在表中的位置,而不是周围的其他方式。

enter image description here

0

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