1

首先,我希望能够更新所有属性/字段并且没有单个唯一键。我有一个层次结构,比如每台 PC 都可以归类为 PC1/PC2/PC3 无法举例,每台 PC 都有网络和软件信息。设计和示例是

Parent Table PC(EmpName, PCName, HostName,.... PhysicalLocation, PCType) EMPName,PCName,PCType结合使这张桌子独一无二。

示例记录('XYZ', 'Work Laptop','XYZ-PC',.....,'DESK-123','PC1')

子表PCNetwork(EmpName, PCName, HostName,IPAddr,....,PhysicalLocation,PCType)

example record1 ('XYZ', 'Work Laptop','XYZ-PC','0.0.0.0',....,'DESK-123','PC1')

example record2 ('XYZ', 'Work Laptop','XYZ-PC','0.0.0.1',....,'DESK-123','PC1')

由于我希望所有字段都是可修改的,因此我在两者中都添加了代理键 ID 列。我已将 PC-Id 用作网络表的 FK,但在插入时我必须编写一个查询以从 PC 表中获取 Id。

有两个问题,如果我使用自然/复合键,我不能对每条记录进行更新,因为更新是通过不允许主键更新的 Asp.Net Gridview 完成的。

如果我使用代理键,则可能会出现重复记录,并且我无法引用它们或将外键约束施加到其他字段,因为它们只有通过组合所有三个字段才能是唯一的。

我正在使用 SQL Server 2008 和 ASP.Net 4.0

我肯定错过了一些东西,任何人都可以为此提供帮助或建议一个好的设计。谢谢!!

4

1 回答 1

1

如果我使用代理键,则可能会出现重复记录,并且我无法引用它们或将外键约束施加到其他字段,因为它们只有通过组合所有三个字段才能是唯一的。

您可以拥有代理键​​,但仍然可以消除重复的可能性创建引用约束。首先将您的候选键列标记为唯一:

alter table PC
add constraint UK_PC_EMPName_PCName_PCType
unique (EMPName, PCName, PCType);

然后,您可以像这样添加外键:

alter table PCNetwork
add constraint FK_PC_PCNetwork
foreign key (EMPName, PCName, PCType)
references PC (EMPName, PCName, PCType);

但是,我必须说,我并不完全理解您所描述的架构,因此我不确定是否有更好的数据建模方法。也就是说,这里有一些观察:

  • PhysicalLocation乍一看PCType似乎是冗余数据。你应该决定他们最适合哪张桌子。
  • 您可以有一列PCNetwork参考您的代理键 in PC,因此您不需要EmpName, PCName, HostName在 PCNetwork 中(但仍然在 中创建唯一键PC)。
于 2013-04-03T20:56:37.247 回答