数据库视图模拟来自单个非规范化表的规范化表

Database Views to simulate normalised tables from a single denormalised one

我们有一个带有非规范化平面 table 的报表存储,它将相同的数据存储到不同数据库中的多 table 模型。

平面table(示例):

| col 1 | col 2 | col 3 | timestamp |
|-------|-------|-------|-----------|
| val1  | val2  | val3  | 1/1/1990  |
| val1  | val9  | val3  | 1/1/1990  |

在多个 table 中:

| id1 | id2 | timestamp |
|-----|-----|-----------|
| 001 | 111 | 1/1/1990  |
| 001 | 112 | 1/1/1990  |

| id1 | col 1 | col 3 |
|-----|-------|-------|
| 001 | val1  | val3  |

| id2 | col 2 |
|-----|-------|
| 111 | val2  |
| 112 | val9  |

有几个旧的报告查询我们想移植到新的平面table,而不必预先全部重写它们——它们很多而且很复杂。

是否有一种编写视图的方法可以从单个平面 table 模拟一组关系 table,以便旧的报告查询无需修改即可工作?

这里我创建了动态 ID。您还可以最初使用固定键使 table 成为 table ,并且总是在 flattable 中添加或删除行时对此处的键执行相同的操作。否则使用 OVER 语句代替 Groub。

CREATE VIEW multitabkey AS
SELECT ROW_NUMBER() as key, col1, col3
FROM flattable
Group by col1, col3

警告:这些键不是持久的:如果删除第一行,所有其他键的 ID 都会比以前小。你有 dynamic ID,但它们是 consistnet.

如果您有密钥的翻译,您可以按如下方式使用它们:

CREATE VIEW multitabone AS
SELECT f.timestamp
FROM flattable as f
JOIN multitabkey as m ON m.col1 = f.col1 AND m.col3 = f.col3
Group by col1, col3

我假设 col1 , col2 一起是自然键。

如前所述,这是一种解决方法,您的数据库不是第三范式,这可能会导致不一致。