Sql 可以';t共享主键
场景:每个“用户”都有0或1个“银行帐户”。每个“公司”有0或1个“银行账户”。无法共享“银行帐户”记录。如何设置数据库以对此进行建模?我试过这个: “BankAccount”表中的“BankAccountId”(主键)作为外键,而“Company”表中的“CompanyId”列作为外键。Sql 可以';t共享主键,sql,sql-server,relational-database,Sql,Sql Server,Relational Database,场景:每个“用户”都有0或1个“银行帐户”。每个“公司”有0或1个“银行账户”。无法共享“银行帐户”记录。如何设置数据库以对此进行建模?我试过这个: “BankAccount”表中的“BankAccountId”(主键)作为外键,而“Company”表中的“CompanyId”列作为外键。 “Company”表中的“BankAccount ID”列可为空,作为“CompanyBankAccount”表的外键。对于用户表,我遵循相同的模式 虽然这是可行的(强制规定任何公司或用户不得拥有超过1个银行
“Company”表中的“BankAccount ID”列可为空,作为“CompanyBankAccount”表的外键。对于用户表,我遵循相同的模式
虽然这是可行的(强制规定任何公司或用户不得拥有超过1个银行账户,并且其他用户或公司不得共享任何银行账户),但创建具有银行账户的新公司或用户是很麻烦的(我必须首先插入BankAccountId为空的公司/用户,然后插入新的BankAccount记录,然后插入新的[company/user]BankAccountRecord,然后更新我刚刚插入的公司/用户记录上的“BankAccountId”字段)。似乎应该有一种更简单的方法。有人有更优雅的解决方案吗?在公司和用户表中省略BankAccountId列可能更容易——只需按公司ID或用户ID对联接表进行索引,您就可以在需要时轻松调出BankAccountId。除非您有多对多关系,不需要关系表和表之间的直接关系 有几种方法可以做到这一点,例如在
BankAccount
表中仅使用UserId
和CompanyId
:
User
UserId int primary key
...
Company
CompanyId int primary key
...
BankAccount
UserId int null
CompanyId int null
...
您可以将BankAccountId
放入User
和Company
表中:
User
BankAccountId int null
...
Company
BankAccountId int null
...
BankAccount
BAnkAccountId int primary key
...
您可以在BankAccount
表中使用一个键,并为关系类型使用一个标志:
User
UserId int primary key
...
Company
CompanyId int primary key
...
BankAccount
OwnerId int not null
IsCompanyAccount bit not null
...
在您描述的场景中,BankAccount表上的OwnerId必须是CompanyId或UserId没有任何限制。我知道我可以在应用程序层强制执行这一点,但如果可能,我也希望在数据库层强制执行数据完整性。@KevinBirdwell:我没有描述一个场景。They是三个不同的场景。是的,我进展得太快了。您描述的第一个场景没有强制执行银行帐户只能属于一个公司或一个用户,但不能同时属于两个。第二个场景没有强制执行银行帐户只属于一个用户或一个公司。如上所述,第三个场景没有强制执行银行帐户的所有者是有效的用户或公司记录。@KevinBirdwell:是的,这是正确的,您不可能拥有一切……这两种情况都比您开始时的情况要好,在CompanyBankAccount表中,您可以为每个公司拥有任意数量的帐户,但根据company表可以拥有不同的帐户。。.同意,这些场景比最初的场景要好。我希望有人能提出一种方法,让数据库执行所有完整性,而不必像我最初的尝试那样求助于复杂的场景(仍然没有完全执行完整性)。我非常感谢您提出的方案。我只需要权衡一下,哪一个方案(包括antlersoft的方案)能够在应用层实现数据库强制完整性和可用性的最佳平衡。我面临的困境(与此问题没有直接关系)这种映射仍然会导致我的ORM工具将银行帐户和所有者(公司或用户)之间的关系视为0..1:N,而不是0..1:1,即使索引(UK约束)将不会在数据库中发生这种情况。实际上,我最初的方法也有类似的缺点。但是,我的问题是关于DB,而不是关于我的ORM,因此,您已经回答了这个问题,并提供了一个更优雅的解决方案。谢谢!…现在迫使我的ORM做我想做的事情。