传递闭包 Table 重构
Transitive-Closure Table Restructure
我如何能够从当前结构中检索完整树,或重构当前 table 结构以允许优化递归查询?
问题
无法在没有迭代的情况下从基础组件中检索完整的组件树。
单个组件可以有未定义数量的连接(深度)。
组件没有父组件属性,因为每个组件都可以与多个组件相关。
无法递归更新组件的受影响属性值。
例如,如果组件的价格发生变化,则所有相关 components_of.
的价格都会更新
当前结构
组件
primary key (id)
| id | price |
|----|------ |
| A | 1 |
| B | 1 |
| C | 1 |
| D | 2 |
| E | 2 |
component_closure
unique index (component, component_of)
index (component_of)
FK (component) References component (id)
FK (component_of) References component (id)
| component | component_of |
|--------------------------|
| D | B |
| D | C |
| B | A |
| E | C |
| E | A |
生成的图形模型:
示例查询:
UPDATE component
SET price = 2
WHERE id = 'A';
期望结果(*表示递归更新值)
| id | price |
|----|------ |
| A | 2 |
| B | 2 | *
| C | 1 |
| D | 3 | *
| E | 3 | *
我想我需要将整个树关系存储在 component_closure table 中,以便我能够检索所有组件的 component_of 关系并使用用于确定组件顺序的深度列。虽然当不需要全树时这看起来很浪费,例如立即 components_of.
例如:
| component | component_of | depth |
|-----------|--------------|-------|
| D | A | 1 |
| D | B | 2 |
| D | C | 1 |
是的,如果要存储传递闭包,则需要存储所有路径。
对于某些操作,存储长度为0的路径甚至有帮助:
| component | component_of | depth |
|-----------|--------------|-------|
| D | D | 0 |
| D | A | 1 |
| D | B | 2 |
| C | C | 0 |
| B | B | 0 |
| B | A | 1 |
| A | A | 0 |
在 MySQL 8.0 中,将需要 none。我们终于可以使用递归查询了。
我如何能够从当前结构中检索完整树,或重构当前 table 结构以允许优化递归查询?
问题
无法在没有迭代的情况下从基础组件中检索完整的组件树。
单个组件可以有未定义数量的连接(深度)。
组件没有父组件属性,因为每个组件都可以与多个组件相关。
无法递归更新组件的受影响属性值。 例如,如果组件的价格发生变化,则所有相关 components_of.
的价格都会更新当前结构
组件
primary key (id)
| id | price |
|----|------ |
| A | 1 |
| B | 1 |
| C | 1 |
| D | 2 |
| E | 2 |
component_closure
unique index (component, component_of)
index (component_of)
FK (component) References component (id)
FK (component_of) References component (id)
| component | component_of |
|--------------------------|
| D | B |
| D | C |
| B | A |
| E | C |
| E | A |
生成的图形模型:
示例查询:
UPDATE component
SET price = 2
WHERE id = 'A';
期望结果(*表示递归更新值)
| id | price |
|----|------ |
| A | 2 |
| B | 2 | *
| C | 1 |
| D | 3 | *
| E | 3 | *
我想我需要将整个树关系存储在 component_closure table 中,以便我能够检索所有组件的 component_of 关系并使用用于确定组件顺序的深度列。虽然当不需要全树时这看起来很浪费,例如立即 components_of.
例如:
| component | component_of | depth |
|-----------|--------------|-------|
| D | A | 1 |
| D | B | 2 |
| D | C | 1 |
是的,如果要存储传递闭包,则需要存储所有路径。
对于某些操作,存储长度为0的路径甚至有帮助:
| component | component_of | depth |
|-----------|--------------|-------|
| D | D | 0 |
| D | A | 1 |
| D | B | 2 |
| C | C | 0 |
| B | B | 0 |
| B | A | 1 |
| A | A | 0 |
在 MySQL 8.0 中,将需要 none。我们终于可以使用递归查询了。