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

How adding redundant data can get rid of complex join in Denormalization?

我正在研究非规范化定义,我想知道如何添加冗余数据才能摆脱复杂的连接?

考虑以下两个关系:

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 table,我们的 table 可能如下所示:

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

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

使用新的 tables,我们现在可以像这样获取员工和经理姓名列表:

SELECT employee_name, manager_name
FROM Employee

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