无法共享主键的表之间的一对一关系

时间:2012-06-04 16:58:34

标签: sql sql-server relational-database

场景:每个“用户”都有0或1“BankAccount”。每个“公司”都有0或1“BankAccount”。 “BankAccount”记录无法共享。如何设置我的数据库来建模?我试过这个:

  “CompanyBankAccount”表,其中“BankAccountId”(主键)作为“BankAccount”表中的外键,“CompanyId”列作为“公司”表中的外键。
  “Company”表,可以为“BankAccountId”列,作为“CompanyBankAccount”表中的外键。我对用户表遵循了相同的模式。

虽然这有效(强制执行以下规则:任何公司或用户都不能拥有超过1个银行帐户,并且其他用户或公司不能共享银行帐户),但创建新公司或拥有银行帐户的用户是繁琐(我必须首先插入具有NULL BankAccountId的公司/用户,然后插入新的BankAccount记录,然后插入新的[Company / User] BankAccountRecord,然后更新我刚刚插入的公司/用户记录中的“BankAccountId”字段) 。似乎应该有一个更简单的方法。有没有人有更优雅的解决方案?

2 个答案:

答案 0 :(得分:0)

在公司和用户表中省略BankAccountId列可能更容易 - 只需通过CompanyId或UserId索引连接表,您就可以在需要时轻松提取BankAccountId。

答案 1 :(得分:0)

除非您具有多对多关系,否则不需要关系表,并且您不需要关系表和表之间的直接关系。

有几种方法可以做到这一点,例如UserId表中只有CompanyIdBankAccount

User
  UserId int primary key
  ...

Company
  CompanyId int primary key
  ...

BankAccount
  UserId int null
  CompanyId int null
  ...

您可以将BankAccountId放入UserCompany表中:

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
  ...