【问题标题】:Database Design Has A relationship with Surrogate Key数据库设计与代理键有关系
【发布时间】:2013-04-03 20:46:39
【问题描述】:

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

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

【问题讨论】:

  • 如果我使用自然/复合键,我无法对每条记录进行更新,因为更新是通过不允许主键更新的 Asp.Net Gridview 完成的。你为什么这么认为?
  • 因为我试过了,但我无法更新主键,它只会更新其他字段,但不会更新主键,一些帖子还说 Gridview 更新在 where 子句中与 pk 一起工作,因为我正在更改那个 pk 并使用那个 pk 作为条件。
  • Gridviews 只负责显示和更新它们绑定的 数据源对象。他们不更新数据库。现在很有可能您的数据源不保留旧值,从而无法处理更新主键,但这不是 GridView 的错。
  • 是的,确实没有处理旧值,但我不确定这是谁的错,所以我决定改用代理键。

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


【解决方案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(但仍会在 PC 中创建唯一键)。

【讨论】:

  • 如果我在 PCName 中有空值(我确实有)怎么办?我忘了添加,因为我有 3 种 PC 类型 PC2 没有(我的意思是不需要)PCName 属性,所以我在插入时将其隐藏,因此它为空,但记录仍然是唯一的,该字段也为空。感谢您的回答。
  • 只要您的数据中没有违反您的唯一密钥(包括空值),那么这将正常工作。所有字段都可以在唯一键和任何相应的外键中为空。但是,您不能使用任何可为空的列创建主键。
  • 我收到此错误The ALTER TABLE statement conflicted with the FOREIGN KEY constraint FK_PC_PCNetwork The conflict occurred in database "test.mdf" table "dbo.PC"
  • 如果您在PC 上创建的唯一密钥很好,您可能在PCNetwork 中有一些数据在PC 中不存在。
  • 哇!我也是这么想的,太感谢了让我通过删除那些额外的数据来测试。
猜你喜欢
  • 2011-04-14
  • 1970-01-01
  • 1970-01-01
  • 2014-02-28
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
  • 2014-11-30
  • 2011-06-24
相关资源
最近更新 更多