数据库规范化

sho*_*cus 9 database database-design normalization database-normalization

我是数据库设计的新手,我已经阅读了很多关于规范化的内容.如果我有三张桌子:住宿,火车站和机场.我是否在每个表中都有地址列或其他表引用的地址表?是否存在过度规范化的问题?

谢谢

Nea*_*alB 5

数据库规范化就是构建关系(表),它们维护关系(表)中的事实(列)之间以及构成模式(数据库)的各种关系(表)之间的某些功能依赖性.有点满口,但这就是它的全部意义.

关系数据库理论中五种 常规形式的简单指南是正常形式的经典参考.本文简单地定义了每种常规形式的本质及其对数据库表设计的重要性.这是一个非常好的"触摸石"参考.

要正确回答您的具体问题,需要其他信息.您需要问的一些关键问题是:

  • 地址是一个简单的事实(例如文本blob)还是复合事实(例如由多个属性组成:地址行,城市名称,邮政编码等)
  • 与"住宿","机场"和"火车站"有关的其他"事实"是什么?
  • 什么样的"事实"唯一且最低限度地标识"机场","住宿"和"火车站"(这些事实通常被称为钥匙或候选钥匙)?
  • 地址事实和构成每个关系键的事实之间存在哪些功能依赖?

所有这些,你的问题的答案并不像人们希望的那样直截了当!

有没有"过度正常化"这样的事情?也许.这取决于您已识别并用于构建表的功能依赖性对您的应用程序域是否重要.

例如,假设确定地址由多个属性组成; 其中一个是邮政编码.从技术上讲,邮政编码也是一个复合项目(至少加拿大邮政编码是).进一步规范化数据库以识别这些事实可能会过度规范化.这是因为邮政编码的组成部分与您的应用程序无关,因此将它们纳入数据库设计将是一种过度规范化.


nWo*_*orx 0

我认为在这种情况下,每个表中都有地址列是可以的。您几乎不会有一个地址会被使用两次以上。大多数地址每个实体仅使用一个。

但额外的表中可能包含街道、城市、国家的名称......

最重要的是,每个火车站、住宿和机场可能只有一个地址,因此这是一种 n:1 关系。