Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 数据库设计与代理键有关系_Asp.net_Sql_Sql Server 2008_Database Design_Surrogate Key - Fatal编程技术网

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

Asp.net 数据库设计与代理键有关系,asp.net,sql,sql-server-2008,database-design,surrogate-key,Asp.net,Sql,Sql Server 2008,Database Design,Surrogate Key,首先,我希望能够更新所有属性/字段,并且没有唯一的键。我有一个层次结构,就像每台电脑都可以归类为PC1/PC2/PC3。我不能给出示例,每台电脑都有网络和软件信息。设计和示例如下所示 父表PC(EmpName、PCName、HostName、.PhysicalLocation、PCType)EmpName、PCName、PCType的组合使该表唯一 示例记录('XYZ','Work Laptop','XYZ-PC',…,'DESK-123','PC1') 子表PCNetwork(EmpName、

首先,我希望能够更新所有属性/字段,并且没有唯一的键。我有一个层次结构,就像每台电脑都可以归类为PC1/PC2/PC3。我不能给出示例,每台电脑都有网络和软件信息。设计和示例如下所示

父表PC(EmpName、PCName、HostName、.PhysicalLocation、PCType)
EmpName、PCName、PCType的组合使该表唯一

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

子表
PCNetwork(EmpName、PCName、主机名、IPAddr、、物理位置、PCType)

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

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

因为我希望所有字段都可以修改,所以我在这两个字段中都添加了代理键Id列。我使用PC Id作为FK到网络表,但在插入时,我必须编写一个查询以从PC表中获取Id

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

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

我正在使用SQLServer2008和ASP.NET4.0

我肯定错过了一些东西,有谁能帮我或建议一个好的设计。谢谢

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

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

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
    中有一列,在
    PC
    中引用您的代理密钥,这样您就不需要在PCNetwork中使用
    EmpName、PCName、HostName
    (但仍然在
    PC
    中创建唯一密钥)
如果我使用代理键,可能会有重复记录,我不能引用它们或将外键约束放到其他字段,因为它们只有通过组合所有三个字段才能唯一

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

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
    中有一列,在
    PC
    中引用您的代理密钥,这样您就不需要在PCNetwork中使用
    EmpName、PCName、HostName
    (但仍然在
    PC
    中创建唯一密钥)

如果PCName中有空值(我确实有空值),该怎么办?我忘了添加,因为我有3种PC类型PC2没有(我的意思是它不是必需的)PCName属性,所以我在插入时将其隐藏,这样它会变为null,但记录仍然是唯一的,该字段也是null。谢谢你的回答。只要你的数据中没有违反你的唯一密钥(包括空值),那么这就可以了。唯一键和任何对应的外键中的所有字段都可以为空。但是,您无法使用任何可为空的列创建主键。我收到以下错误
ALTER TABLE语句与外键约束FK_PC_PC网络冲突冲突冲突发生在数据库“test.mdf”TABLE“dbo.PC”
中,如果您的唯一键在
PC上创建得很好,您可能在
PCNetwork
中有一些在
PC
中不存在的数据。哇!我也这么想,非常感谢。让我通过删除这些额外数据进行测试。如果PCName中有空值(我确实有空值),该怎么办?我忘了添加,因为我有3种PC类型PC2没有(我的意思是它不是必需的)PCName属性,所以我在插入时将其隐藏,这样它会变为null,但记录仍然是唯一的,该字段也是null。谢谢你的回答。只要你的数据中没有违反你的唯一密钥(包括空值),那么这就可以了。唯一键和任何对应的外键中的所有字段都可以为空。但是,您无法使用任何可为空的列创建主键。我收到以下错误
ALTER TABLE语句与外键约束FK_PC_PC网络冲突冲突冲突发生在数据库“test.mdf”TABLE“dbo.PC”
中,如果您的唯一键在
PC上创建得很好,您可能在
PCNetwork
中有一些在
PC
中不存在的数据。哇!我也这么想,非常感谢。让我通过删除这些额外数据来进行测试。如果我使用natural/composite键,我无法对每条记录进行更新,因为更新是通过Asp.Net Gridview完成的,它不允许主键更新。你为什么这么认为?因为我试过了,但我无法更新主键,它只更新了其他字段,但没有更新主键,一些帖子还说Gridview更新与where子句中的pk一起工作