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

前端之家收集整理的这篇文章主要介绍了数据库 – 在SQL中处理一对一关系的最佳方法是什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我有一些可能是也可能不是或与Bravo或Charlie相关的事情.

这些是一对一的关系:没有阿尔法将涉及到一个以上的布拉沃.没有Bravo将与多个Alpha相关联.

我有几个目标:

>一个易于学习的系统
保持.
>我的数据完整性
数据库.
>匹配的模式
现实世界,逻辑组织
我的资料
>我/我的类/对象
编程映射好
数据库表(àla Linq to sql)
>快速的读写操作
>有效利用空间(几个空字段)

我有三个想法…

PK = primary key  
FK = foreign key  
NU = nullable

一个表与许多nullalbe字段(平面文件)…

Alphas
      --------
   PK AlphaId
      AlphaOne
      AlphaTwo
      AlphaThree
   NU BravoOne
   NU BravoTwo
   NU BravoThree
   NU CharlieOne
   NU CharlieTwo
   NU CharlieThree

许多具有零nullalbe字段的表…

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

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

      Charlies
      --------
FK PK AlphaId
      CharlieOne
      CharlieTwo
      CharlieThree

两者的最佳(或最差):许多表的空值很多

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

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

      Charlies
      --------
   PK CharlieId
      CharlieOne
      CharlieTwo
      CharlieThree

如果Alpha必须是Bravo或Charlie,而不是两者?

如果不是只是Bravos和Charlies,Alphas也可以是Deltas,Echos,Foxtrots或Golfs等中的任何一个?

编辑:这是问题的一部分:Which is the best database schema for my navigation?

解决方法

如果您希望每个Alpha只与一个Bravo相关,我将投票使用FK / PK组合的可能性:
Bravos
      --------
FK PK AlphaId
      BravoOne
      BravoTwo
      BravoThree

这样一个只有一个Bravo可能会指向你的Alphas.

如果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

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

猜你在找的MsSQL相关文章