数据库设计与代理键有关系

时间:2013-04-03 20:46:39

标签: asp.net sql sql-server-2008 database-design surrogate-key

首先,我希望能够更新所有属性/字段,并且没有唯一的唯一键。我有一个层次结构,像每台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')

由于我希望所有字段都可以修改,因此我在两者中都添加了Surrogate Key Id列。我已经使用PC-Id作为FK到网络表,但插入时我必须编写一个查询来从PC表中获取Id。

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

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

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

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

1 个答案:

答案 0 :(得分: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);
但是,我必须说,我并不完全理解你所描述的架构,所以我不确定是否有更好的数据建模方法。也就是说,这里有一些观察:

  • PhysicalLocationPCType乍一看似乎是冗余数据。您应该决定最适合哪个表格。
  • 您可以在PCNetwork中找到一个列,在PC中引用您的代理键,因此您在PCNetwork中不需要EmpName, PCName, HostName(但仍会在{{{{}}中创建唯一键1}})。