在数据库设计中需要帮助

时间:2013-07-21 11:30:36

标签: database oracle database-design

我有像这样的国家/地区表中的数据

ID      Country
1       US
2       ARG
3       IND

在上表中,ID是主键。我需要像这样创建另一个受影响的国家/地区表

Country    Affected_country
 1             ARG
 1             IND
 2             US

在上表中,Country列和Affected_country列一起是主键。受影响国家/地区中的国家/地区列是国家/地区表中ID列的外键。

这是设计数据库的正确方法吗?

4 个答案:

答案 0 :(得分:4)

我建议国家/地区表的设计是次优的。您不需要ID列(除非您使用的某种框架并未意识到您不需要在每个表格中使用ID列)。你可以使用:

表国家:

  • 代码(ISO 3166 2字母代码)
  • 姓名(国家/地区的全名)

代码列将是主键; name列也是唯一的,并且是替代密钥。如果您必须拥有ID列,则代码列仍然是替代密钥。

如果您愿意,可以使用ISO 3166 3个字母的国家/地区代码,但您应该保持一致。使用2个字母和3个字母的代码组合是草率的。

Affected_Country表有两列:

  • 国家
  • AffectedCountry

这两个都是国家/地区表中国家/地区代码的外键引用。受影响国家/地区表中的样本数据为:

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。另一种选择可以是将受影响的国家作为主要国家/地区表格中的逗号分隔列表。