如何添加冗余数据可以摆脱非规范化中的复杂连接?

时间:2017-03-28 12:09:13

标签: database normalization database-normalization denormalization

我正在通过Denormalizaition定义,我想知道如何添加冗余数据可以摆脱复杂的连接?

1 个答案:

答案 0 :(得分:0)

考虑以下两种关系:

Department (department_id PK, department_name, manager_employee_id)
Employee (employee_id PK, employee_name, department_id)

要获取员工姓名列表及其经理姓名,我们需要如下查询:

SELECT e.employee_name, m.employee_name AS manager_name
FROM Employee AS e
INNER JOIN Department AS d ON e.department_id = d.department_id
INNER JOIN Employee AS m ON d.manager_employee_id = m.employee_id

现在,如果我们将传递函数依赖employee_id -> department_id -> manager_employee_id -> employee_name非规范化到Employee表中,我们的表可能如下所示:

Department (department_id PK, department_name, manager_employee_id)
Employee (employee_id PK, employee_name, department_id, manager_employee_id, manager_name)

实际上,这可能不是一个好设计,因为如果没有小心保持同步,冗余可能会导致数据一致性。但是,出于本示例的目的,我们将忽略该风险。

使用新表,我们现在可以获得员工和经理名称列表,如下所示:

SELECT employee_name, manager_name
FROM Employee

冗余可以帮助更简单地表达某些查询,但它可能会带来数据不一致的风险,需要仔细考虑和控制。冗余还需要更多的存储空间,并且可以使查询更慢,因为更少的行可以适合磁盘上的页面。另一方面,它可以通过消除连接或计算来更快地进行一些查询,甚至可以用来强制执行一致性。每个案例都需要根据自身情况加以考虑。