【问题标题】:How adding redundant data can get rid of complex join in Denormalization? [closed]添加冗余数据如何摆脱非规范化中的复杂连接? [关闭]
【发布时间】:2017-08-21 12:07:06
【问题描述】:

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

【问题讨论】:

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

标签: database normalization database-normalization denormalization


【解决方案1】:

考虑以下两种关系:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 2016-11-18
    • 2013-02-13
    • 2018-02-07
    相关资源
    最近更新 更多