0

I have data in country table like this

ID      Country
1       US
2       ARG
3       IND

In the above table, ID is the primary key. I need to create another affected country table like this

Country    Affected_country
 1             ARG
 1             IND
 2             US

In the above table, Country column and Affected_country column together are primary key. Country column in affected country is the foreign key to ID column in country table.

Is this right way to design the database?

4

4 回答 4

4

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

表国家:

  • 代码(ISO 3166 2 字母代码)
  • 姓名(国家全称)

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

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

Affected_Country 表将有两列:

  • 国家
  • 受影响国家

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

Country   AffectedCountry
US        IN
US        AR
AR        US

如果您完全了解国家/地区代码,这是有道理的,并且如果您不知道国家/地区代码的含义,这并不比原始设计差。

于 2013-07-21T12:07:34.887 回答
1

不。第二列也应该是指向国家主键的外键:

Country    Affected_country
 1             2
 1             3
 2             1
于 2013-07-21T11:35:25.983 回答
0

我认为对受影响的国家/地区的两个字段使用相同类型的 int 会更好。在这种情况下,您可以在表国家/地区的字段 id 上创建 2 个外键。

于 2013-07-21T11:38:02.810 回答
-2

好吧,该数据库设计没有任何问题。但是您可以尝试探索其他替代方案,具体取决于功能要求、将在这些表上运行哪种选择或插入查询等。

正如@JBNizet 所建议的,一种替代方法是在 Affected_country 列中也使用国家 ID。另一种选择可能是将受影响的国家作为逗号分隔的列表保留在主要国家/地区表本身中。

于 2013-07-21T11:47:06.913 回答