添加冗余数据如何摆脱非规范化中的复杂连接?
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 并且会使查询变慢,因为磁盘上的一个页面可以容纳更少的行。另一方面,它可以通过消除连接或计算使某些查询更快,甚至可以用于强制一致性。每个案例都需要根据自身的优点来考虑。
我正在研究非规范化定义,我想知道如何添加冗余数据才能摆脱复杂的连接?
考虑以下两个关系:
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 并且会使查询变慢,因为磁盘上的一个页面可以容纳更少的行。另一方面,它可以通过消除连接或计算使某些查询更快,甚至可以用于强制一致性。每个案例都需要根据自身的优点来考虑。