在SQL中处理一对一关系的最佳方法是什么?

Zac*_*son 12 linq database schema database-design linq-to-sql

比方说,我已经得到了阿尔法的东西,可能会或可能不会或将布拉沃或查理的事情.

这些是一对一的关系:没有Alpha将涉及多个Bravo.并且Bravo不会涉及多个Alpha.

我有几个目标:

  • 一个易于学习和维护的系统.
  • 数据完整性在我的数据库中执行.
  • 与我的数据的真实世界,逻辑组织相匹配的模式.
  • 我的编程中的类/对象很好地映射到数据库表(àLinqto SQL)
  • 快速读写操作
  • 有效利用空间(少数空字段)

我有三个想法......

PK = primary key  
FK = foreign key  
NU = nullable
Run Code Online (Sandbox Code Playgroud)

一张桌子上有很多nullalbe字段(平面文件)......

      Alphas
      --------
   PK AlphaId
      AlphaOne
      AlphaTwo
      AlphaThree
   NU BravoOne
   NU BravoTwo
   NU BravoThree
   NU CharlieOne
   NU CharlieTwo
   NU CharlieThree
Run Code Online (Sandbox Code Playgroud)

许多表没有nullalbe字段......

      Alphas
      --------
   PK AlphaId
      AlphaOne
      AlphaTwo
      AlphaThree

      Bravos
      --------
FK PK AlphaId
      BravoOne
      BravoTwo
      BravoThree

      Charlies
      --------
FK PK AlphaId
      CharlieOne
      CharlieTwo
      CharlieThree
Run Code Online (Sandbox Code Playgroud)

两者中最好的(或最差的):许多表的nullalbe外键很多......

      Alphas
      --------
   PK AlphaId
      AlphaOne
      AlphaTwo
      AlphaThree
NU FK BravoId
NU FK CharlieId

      Bravos
      --------
   PK BravoId
      BravoOne
      BravoTwo
      BravoThree

      Charlies
      --------
   PK CharlieId
      CharlieOne
      CharlieTwo
      CharlieThree
Run Code Online (Sandbox Code Playgroud)

如果Alpha必须是Bravo或Charlie,而不是两者都是怎么办?

如果不仅仅是Bravos和Charlies,Alphas也可以是Deltas,Echos,Foxtrots或Golfs等......?


编辑:这是问题的一部分:哪个是我导航的最佳数据库架构?

Dav*_*itt 8

如果您希望每个Alpha只与一个Bravo相关,我会投票使用组合FK/PK的可能性:

      Bravos
      --------
FK PK AlphaId
      BravoOne
      BravoTwo
      BravoThree
Run Code Online (Sandbox Code Playgroud)

这样,只有一个Bravo可能会引用你的Alpha.

如果Bravos和Charlies必须互斥,最简单的方法可能是创建一个鉴别器字段:

      Alpha
      --------
   PK AlphaId
   PK AlphaType NOT NULL IN ("Bravo", "Charlie")
      AlphaOne
      AlphaTwo
      AlphaThree

      Bravos
      --------
FK PK AlphaId
FK PK AlphaType == "Bravo"
      BravoOne
      BravoTwo
      BravoThree

      Charlies
      --------
FK PK AlphaId
FK PK AlphaType == "Charlie"
      CharlieOne
      CharlieTwo
      CharlieThree
Run Code Online (Sandbox Code Playgroud)

这样,AlphaType字段强制记录始终属于一个子类型.


Gul*_*zim 1

另一种方法是使用 3 个表来存储 3 个实体,并使用一个单独的表来存储关系。