通常为空的列的建议数据库设计

时间:2012-08-24 18:43:40

标签: mysql sql database database-design

我有一个包含四个字段的表格,通常填写:

`animal`
- id
- type
- name
- weight
- location

如果动物type ='人',则填写另外三个字段。这种情况大约占5%。附加表将是:

`person_additional`
- animal_id (FK)
- IQ
- native_language
- handedness

db设计中建议的做法是将它存储在两个表还是一个表中?这几乎对我没什么影响,但我对最佳实践感到好奇,并且为什么会优先于另一种。

4 个答案:

答案 0 :(得分:3)

两个表可能是正确的方法,但我可能建议使用不同的第二个表。我将其定义为:

`animal_additional`
- animal_id (FK)
- Trait (this would enumerate allowable traits)
- value

这样可以更灵活地为不同类型提供不同的特征,甚至可以为同一类型提供不同的特征。

答案 1 :(得分:2)

如果你要将它们存储在同一个表中,那么这实际上是一个多值依赖;违反第4范式,所以从纯粹主义的角度来看,单独的表更好。

此外,如果添加另一种需要不同类型的补充字段的动物会发生什么 - 如果您的所有数据都在一个表中,那么最终,您将拥有一堆用于不同目的的不同字段。

从实际的角度来看,这取决于数据的使用方式等;

从迂腐的角度来看,其他动物都有动手:)

答案 2 :(得分:1)

除了标准化问题。动物和人是模式的一个实例,称为泛化专业化,或简称gen-spec。其他问题已经涵盖了gen-spec案例关系表的设计。在SO中搜索“类表层次结构”。

示例:Table design and class hierarchies

答案 3 :(得分:0)

将其拆分为2个表的另一个好理由是,通过在一个表中包含所有内容,存储一行所需的空间量将不必要地增加,因为大多数情况下您的列将为空但数据库仍然必须为每一行分配一定量的字节。

分成2个表,可以更有效地利用硬盘空间。