假设我有一些可能是也可能不是或与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字段强制记录始终属于一个子类型.