2015-08-28 79 views
0

我們有一個非規格化平面表格的報告存儲區,它將相同的數據存儲到不同數據庫中的多表模型。數據庫視圖模擬來自單個非規範化表格的規範化表格

平表(例如):

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

有跡象表明,我們想端口到新平表幾個老報告查詢,而無需重寫他們都在前面 - 他們有很多,他們很複雜。

有沒有一種方法可以編寫視圖,它可以模擬單個平面表中的一組關係表,以便舊的報告查詢無需修改即可正常工作?

+0

什麼意思是「非規範化」?不在1號。不在5小時?你能提供一些數據嗎? – inetphantom

+1

@inetphantom編輯添加詳細信息 –

+0

扁桌中的鑰匙是什麼? col1&col3?因爲如果你沒有身份證件,你將無法**直接**創建一個視圖,這意味着你將不得不使用這個信息來使你的ID沒有自然的密鑰 – inetphantom

回答

0

HereI創建動態 ID。您也可以使用修復鍵初始化該表,並且始終在扁平表中添加或刪除一行時使用與此處的鍵相同的操作。否則,請使用OVER聲明代替Groub。

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

警告:這些鍵是不是持久的:如果刪除了第一行,其他所有得到比以前自己的身份證一個smaler。您有動態 ID,但它們是併網

如果你有一個翻譯你的鑰匙,你可以使用它們如下:

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種正常形式。

+0

在Oracle和Mysql上是'ROWNUM',這是由微軟提供的。 – inetphantom

+0

即使使用不同的WHERE子句選擇了兩個視圖,「ROW_NUMBER」會使行匹配嗎?他們需要加入,就好像他們是原始表格一樣。 –

+0

我不確定這一點,你將不得不在SO – inetphantom