2013-02-21 43 views
0

我是數據庫設計新手,在嘗試設計一個時遇到問題。這裏是我的系統: 有3個不同的軟件(SW_A,SW_B,SW_C)和500-600個用戶。每個用戶都可以使用任何軟件並完成一些工作。每項工作都會發送到數據庫。每分鐘6次。 (隨機爲用戶和軟件) 我想要一個數據庫,以保持所有與用於歸檔的軟件相關的用戶操作,並且還想跟蹤與這些軟件相關的所有用戶的即時操作。 (每個軟件只針對不同用戶的最新動作)Oracle數據庫設計視圖或表?

所以我設計了一些東西。這樣的:

表:SW_X_DATA_ARCHIVE

色譜柱:

  • 用戶ID
  • Data_Date
  • SW_A_ActionID

表:SW_X_INSTANT_DATA

山口UMNS:

  • 用戶名
  • Data_Date
  • SW_X_ActionID

當一個新數據到來時,它更新INSTANT_DATA表的相關行,如果該用戶名存在,插入新行,用戶名和數據如果沒有。然後將相同的數據插入到DATA_ARCHIVE表中。

問題是:這種工作有更好的方法嗎?觀看也許? (我讀過某事關於物化視圖,但不知道如何在這裏使用它。) 感謝

+0

物化視圖是否會幫助您或傷害您的問題取決於您將如何處理數據。如果幾乎所有的檢索都只涉及存儲在INSTANT_DATA中的項目,那麼你現在的設計可能是最好的。否則,你可能會更好地設計一個表,並且只爲每個用戶提供最新的行。這個觀點寫起來不容易,即使索引很好,也不會很快。 – 2013-02-21 11:39:12

+0

謝謝沃爾特,我用這個設計沒有問題。 – Turker 2013-03-07 15:00:59

回答

0

Only the latest action for distinct users for each software

您的即時表應該有(用戶標識,SOFTWAREID)一個獨特的複合鍵,以便不可能有多行涉及用戶使用軟件的行。

ARCHIVE表不需要這樣一個唯一的鍵或約束。

如果某行(USERID,SOFTWARE)不存在,您將insert轉換爲INSTANT,或者如果該行已存在,則爲update

通常,插入/更新觸發器將放置在INSTANT表中,以便在INSTANT發生更改時將行插入到ARCHIVE中。

編輯:或者,您可以維護一個表,並有一個視圖,只選擇每個用戶每個軟件的最新動作。您需要爲每個操作添加時間戳,並在(USERID,SOFTWAREID)上放置一個複合索引(非唯一)。決定採取哪種方法可能是基於相對錶現。如果經常需要最新動作信息,我傾向於支持觸發器。

+0

對不起,我寫了SW_X_INSTANT來解釋每種軟件類型都存在INSTANT表。 SW_A_INSTANT_DATA,SW_B_INSTANT_DATA等。因此UserID對於INSTANT_DATA表格將是唯一的。 是的,數據將直接插入到ARCHIVE中。沒有限制。 – Turker 2013-02-21 11:28:46

+0

感謝您的回答蒂姆。我也會嘗試創建一個視圖,它將從Software_Archive表中獲取最新數據,其中UserId是唯一的。這將是另一個問題:) – Turker 2013-02-21 12:01:50