Database 在反规范化过程中,添加冗余数据如何消除复杂的连接?

Database 在反规范化过程中,添加冗余数据如何消除复杂的连接?,database,normalization,database-normalization,denormalization,Database,Normalization,Database Normalization,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

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

考虑以下两个关系:

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\u id->department\u id->manager\u employee\u id->employee\u 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
实际上,这可能不是一个好的设计,因为如果不小心保持同步,冗余可能会导致数据一致性。但是,在本例中,我们将忽略该风险

有了这些新表,我们现在可以得到如下所示的员工和经理姓名列表:

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

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

如果您的数据(完全)非规范化,那么就没有什么可以加入:)@Oilver只是一个简单的问题。非规范化数据中的所有内容都在一个表中吗?您得到的“非规范化”定义是什么?@philipxy我们可以通过以下非规范化定义得出结论:“非规范化数据中的所有内容都在一个表中吗?”添加冗余数据以消除复杂连接的过程,以优化数据库性能。这样做是为了通过从高到低的规范化形式来加速数据库访问。”这是一个模糊而糟糕的“定义”。反规范化是在对某些组件进行规范化之后,使用某些组件的连接而不是组件。(因此,在需要时不必进行这些连接。但在不需要时,查询更为复杂。而且管理完整性更为困难。)