数据库视图模拟来自单个非规范化表的规范化表
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 一起是自然键。
如前所述,这是一种解决方法,您的数据库不是第三范式,这可能会导致不一致。
我们有一个带有非规范化平面 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 一起是自然键。
如前所述,这是一种解决方法,您的数据库不是第三范式,这可能会导致不一致。