数据库规范化 - 外键

时间:2012-10-20 10:43:50

标签: mysql database database-design

我正在尝试理解数据库规范化,我理解一般的想法,但是什么是正确的方法以及什么是多余的。

例如,我有一个标准的员工部门数据库作为第一步。

表是

EMPLOYEES:
id, first_name, last_name, dob, email, city, address, department_name

因此,要将此标准化为第一步,我会将部门名称移至单独的表格,并在必要时以多对一的方式加入。

EMPLOYEES:
id, first_name, last_name, dob, email, city, address, department_id
DEPARTMENTS
id, name

这是否足以进行规范化,或者将department_id之外的所有其他字段移至第employees_meta这样的第二个表更好?想象一下,如果我们在表格中有20多个字段描述员工,那么这是正常的吗?

如果我们正在讨论优化网页,那么正确的规范化是仅包含我们在使用员工表时始终显示的字段,以及我们不经常使用的所有其他信息是否会移动到不同的表中?

4 个答案:

答案 0 :(得分:2)

将城市字段移动到单独的表中,我认为这是正常的。 database normalization的简单键是避免重复值并将其分成单个表。但是,有些数据的情况不需要像性字段那样分开,最好使用枚举数据类型然后再分成其他表。

注意:要在查询中加入很多表,性能会降低。

答案 1 :(得分:2)

EMPLOYEES:
id, first_name, last_name, dob, email, city, address, department_name
  

所以,为了规范化,作为第一步,我会移动部门名称   到一个单独的表,并在必要时加入多对一。

EMPLOYEES:
id, first_name, last_name, dob, email, city, address, department_id
DEPARTMENTS
id, name

根据功能依赖性进行规范化时,原始表总是最终会有更少的列。你从8开始,结束了8。

您将原始表中的“department_name”替换为“department_id”。 规范化指南说“用ID号替换文字”。这不仅 nothing 与规范化有关,而且它引入了强制连接,之前不需要。

这并不一定意味着用ID号替换文本是错误的。 意味着您不应该将其称为规范化。因为它不是。

规范化中的第一个步骤是识别候选键和功能依赖性。

答案 2 :(得分:2)

规范化处理实体。代表模型中实体的所有东西都应该分开(标准化)。

如果您有一个人员(姓名,姓氏等)的表格,所有这些人也是用户和密码登录的用户,那么您不需要进行标准化。

但是如果只有一些人是用户,你应该规范化为2个表(人,具有person_id的用户作为个人实体的链接),如果你需要将人和用户实体存储在几个不同的地方(人与人之间的关系,使用创建和上次修改的用户标记记录,然后更好地规范化。

因此,CatCall声明规范化不会更改带有ID的名称。那就是创建Lookup。

答案 3 :(得分:1)

如果您有关于某个位置的其他信息以及城市,ex(城市,州,邮政编码),则只需将邮政编码与员工数据一起存储即可。有一个名为“美国位置索引”的单独表格或任何包含邮政编码作为主键,城市和州的表格。您可以存储2个州名称变体,完整和缩写。基本上,重点是城市和州很容易通过邮政编码来确定......你可以这样认为.. 美国的每个州都有许多城市,每个城市都有许多邮政编码,但每个邮政编码都标识出特定的城市和州的组合。例如,在纽约市,邮政编码10010将标识为纽约,NY和10001将标识为纽约纽约。但11222将确定为纽约布鲁克林。希望这会有所帮助。