我有像这样的国家/地区表中的数据
ID Country
1 US
2 ARG
3 IND
在上表中,ID是主键。我需要像这样创建另一个受影响的国家/地区表
Country Affected_country
1 ARG
1 IND
2 US
在上表中,Country列和Affected_country列一起是主键。受影响国家/地区中的国家/地区列是国家/地区表中ID列的外键。
这是设计数据库的正确方法吗?
答案 0 :(得分:4)
我建议国家/地区表的设计是次优的。您不需要ID列(除非您使用的某种框架并未意识到您不需要在每个表格中使用ID列)。你可以使用:
表国家:
代码列将是主键; name列也是唯一的,并且是替代密钥。如果您必须拥有ID列,则代码列仍然是替代密钥。
如果您愿意,可以使用ISO 3166 3个字母的国家/地区代码,但您应该保持一致。使用2个字母和3个字母的代码组合是草率的。
Affected_Country表有两列:
这两个都是国家/地区表中国家/地区代码的外键引用。受影响国家/地区表中的样本数据为:
Country AffectedCountry
US IN
US AR
AR US
如果您完全了解国家/地区代码,这是有道理的,如果您不知道国家/地区代码的含义,则不会比原始设计更糟糕。
答案 1 :(得分:1)
没有。第二列也应该是指向国家/地区主键的外键:
Country Affected_country
1 2
1 3
2 1
答案 2 :(得分:0)
我认为对受影响国家/地区使用相同类型的int更好。 在这种情况下,您可以在表格国家/地区的字段ID上创建2个外键。
答案 3 :(得分:-2)
那么,数据库设计没有任何问题。但您可以尝试探索其他替代方案,具体取决于功能要求是什么,在这些表上运行哪种选择或插入查询等。
@JBNizet建议的另一种方法是使用Affected_country列中的国家ID。另一种选择可以是将受影响的国家作为主要国家/地区表格中的逗号分隔列表。