1

我有一个通常填写四个字段的表:

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

如果动物type= '人',则填写三个附加字段。这发生在大约 5% 的时间里。附加表将是:

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

数据库设计中建议的做法是将其存储在两个表还是一个表中?这对我来说几乎没有什么区别,但我很好奇最佳实践以及为什么一个比另一个更可取。

4

4 回答 4

3

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

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

这将使您更灵活地为不同类型设置不同的特征,甚至为同一类型设置不同的特征。

于 2012-08-24T18:56:24.463 回答
2

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

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

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

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

于 2012-08-24T18:50:13.150 回答
1

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

示例: 表设计和类层次结构

于 2012-08-24T19:03:22.383 回答
0

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

拆分为 2 个表,更有效地利用硬盘空间。

于 2012-08-24T18:53:33.247 回答