0

我有以下表格: -

在此处输入图像描述

现在,由于 IP 地址是 Technology 表的多值属性(例如,服务器可以有多个 IP),所以我创建了一个名为 TechnologyIP 的新表。但是它的主键应该是 TechnologyID + IP address 。或者我应该避免将非系统生成的值定义为主键的一部分。

那么 technologyIP 表的 PK 应该是单个 ID 列(如上所示),而不是 technologyID + IPaddress 吗?

提前感谢您的帮助。

4

3 回答 3

1

{TechnologyID, IPAddress} 好吧,无论如何,您都需要自然密钥,以确保同一台服务器不能多次重复相同的 IP 地址。您不能通过创建代理键(例如自动递增的 ID 列)来“删除”现有的自然键。

选择不是关于“自然与代理键”,而是关于“自然与自然+代理键”。

每个约束都有一个成本,所以在所有条件相同的情况下,唯一的自然密钥会更便宜。仅当您有特定原因时才应创建代理键,例如:

  • 使子表中的 FOREIGN KEY 更苗条。
  • 避免 ON UPDATE CASCADE 引用动作。
  • “安抚”您的对象关系映射 (ORM)。

- - 编辑 - -

我突然想到,您可能不想在多个服务器之间共享相同的 IP。是这样吗?如果是这样,那么只有{IPAddress}应该是关键,而不是{TechnologyID, IPAddress}.

于 2013-06-30T18:52:52.663 回答
1

在这种情况下,我会将 PK 设置为 technologyID & IPAddress。主键通常基于基础索引。当您使用以这种方式构建的 PK 时,您将获得出色的读取性能,为特定技术拉回所有 IP。

如果您要向 TechnologyIP 表添加许多附加属性,则 MIT 需要一个代理键,但在这种情况下,您有一个自然键,应该可以很好地服务。

于 2013-06-30T15:19:05.010 回答
1

好吧,这两种解决方案都可以很好地工作。一般来说,我发现为每个表使用自动增量 PK 更容易,因此我会选择额外的单个 ID 列。

于 2013-06-30T15:08:08.863 回答