假设我有可能与Bravo或 Charlie 的事物相关或无关的 Alpha 事物。
这些是一对一的关系:没有任何 Alpha 与一个以上的 Bravo 相关。没有 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 等中的任何一个……?
编辑:这是问题的一部分:哪个是我导航的最佳数据库模式?