数据库视图,用于从单个非规范化表格中模拟规范化表格

时间:2015-08-28 10:56:35

标签: sql-server view database-normalization

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

平台(示例):

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

在多个表中:

| 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  |

有几个旧的报告查询我们想要移植到新的平面表而不必事先重写它们 - 有很多它们很复杂。

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

1 个答案:

答案 0 :(得分:0)

HereI创建动态 ID。您也可以使用修复键初始化该表,并且在平板表中添加或删除行时始终使用此处的键执行相同操作。否则使用OVER语句代替Groub。

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

警告:这些密钥不是持久性的:如果删除第一行,其他所有密钥都会比以前更清楚。您有动态 ID,但它们是 composednet

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

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是一个自然键。

如上所述,这是一种解决方法,您的数据库未处于第3范式,导致不一致。