如何避免关系数据库中的数组?

时间:2014-07-11 09:00:59

标签: sql arrays database rdms

我的数据库描述公司网站。公司网站有几个属性:URL,加载时间等。每个网站都针对一个或多个国家/地区。我在表达网站与国家之间的关系时遇到了问题。

我的设置编号1如下所示:

  • 公司表
  • 国家/地区表
  • 网站表,包含字段WebsiteId,CompanyId(指代Company.id),国家/地区(指向Country.id的数组)以及URL,LoadTime等几个属性

我的设置编号2如下所示:

  • 公司表
  • 国家/地区表
  • 网站表,包含字段WebsiteId,CompanyId(指代Company.id)以及URL,LoadTime等几个属性。
  • 一个WebsiteCountries表,其中包含WebsiteId,CountryId
  • 字段

我对这两种方法都有疑问:

  • 设置号1使用Country.id数组,这使得难以维护
  • 在设置编号1中,CompanyId在网站表中具有唯一约束,但允许在设置编号2中重复。更一般地,CompanyId + Countries可以充当设置1中的候选键。这让我有点不安:我是错了,这是最好的方法吗?

1 个答案:

答案 0 :(得分:2)

@Jodrell已经给了你正确答案 - "设置号2"用化合物PK是最好的解决方案。我只是详细解释一下。

有公司,国家和网站。对于他们每个人,我们创建一个单独的表。

现在是参考的时候了:

  • 如果公司可能只有一个网站,那么它就是一对一的关系。如果它可能有很多网站,那么它就是一对多的关系。在这两种情况下,您在网站表中都有一个外键CompanyId - 它只在UNIQUE约束中有所不同。

  • 你写的是#34;每个网站都针对一个或几个国家。"此外,对于每个国家/地区,可能有一个或多个网站(针对不同的公司)。这意味着它是一种经典的多对多关系。在这种情况下,您必须添加联结表 - WebsiteCountries。在这里,您将拥有一个由两列组成的复合主键:(WebsiteId,CountryId)。这样可以避免重复。

希望这有帮助。