我有以下表格: -
现在,由于 IP 地址是 Technology 表的多值属性(例如,服务器可以有多个 IP),所以我创建了一个名为 TechnologyIP 的新表。但是它的主键应该是 TechnologyID + IP address 。或者我应该避免将非系统生成的值定义为主键的一部分。
那么 technologyIP 表的 PK 应该是单个 ID 列(如上所示),而不是 technologyID + IPaddress 吗?
提前感谢您的帮助。
我有以下表格: -
现在,由于 IP 地址是 Technology 表的多值属性(例如,服务器可以有多个 IP),所以我创建了一个名为 TechnologyIP 的新表。但是它的主键应该是 TechnologyID + IP address 。或者我应该避免将非系统生成的值定义为主键的一部分。
那么 technologyIP 表的 PK 应该是单个 ID 列(如上所示),而不是 technologyID + IPaddress 吗?
提前感谢您的帮助。
{TechnologyID, IPAddress}
好吧,无论如何,您都需要自然密钥,以确保同一台服务器不能多次重复相同的 IP 地址。您不能通过创建代理键(例如自动递增的 ID 列)来“删除”现有的自然键。
选择不是关于“自然与代理键”,而是关于“自然与自然+代理键”。
每个约束都有一个成本,所以在所有条件相同的情况下,唯一的自然密钥会更便宜。仅当您有特定原因时才应创建代理键,例如:
- - 编辑 - -
我突然想到,您可能不想在多个服务器之间共享相同的 IP。是这样吗?如果是这样,那么只有{IPAddress}
应该是关键,而不是{TechnologyID, IPAddress}
.
在这种情况下,我会将 PK 设置为 technologyID & IPAddress。主键通常基于基础索引。当您使用以这种方式构建的 PK 时,您将获得出色的读取性能,为特定技术拉回所有 IP。
如果您要向 TechnologyIP 表添加许多附加属性,则 MIT 需要一个代理键,但在这种情况下,您有一个自然键,应该可以很好地服务。
好吧,这两种解决方案都可以很好地工作。一般来说,我发现为每个表使用自动增量 PK 更容易,因此我会选择额外的单个 ID 列。