2009-06-03 55 views
5

我一直在考慮在數據庫中保存「實時」數據集和一組草案的最佳方法。實時版本顯示在網站上,並且草稿版本一直運行,直到它準備好上線爲止。該模型是關係型的,由許多表格組成。實時數據和草案數據的數據庫模型

我現在的方法是有2個數據庫,一個用於草案,另一個用於生活。 當您提升數據存活時,SQL只是將數據從草稿數據庫複製到活動數據庫。

這很好,但有點慢,似乎凌亂。經常,SQL必須考慮兩組表。

另一種方法是將Live指示器作爲每個表的關鍵字的一部分,這樣我就可以在同一個表中保存實時和草稿 - 並更新指示器以使數據生效。 - 我不是真的賣這個想法。

  • DBMS是Sybase。

如果有人有任何其他建議,我將不勝感激。

U.M.

+0

感謝迄今爲止的答案。他們給了我更多的想法。 - 將生活和草稿放在同一張桌子上 - 我必須確保草稿數據不會偶然顯示。 - 有一個標誌,並將其設置在草稿行中,以使它們生活....我也可以將舊的活動行標記爲「過時」,然後應用程序將從「實時」中刪除並保存爲草稿有任何變化。這樣,當數據被標記爲活動時,我可以避免大的刪除。 – sqlchan 2009-06-07 14:01:56

回答

2

具有一個表

DataTable 
    DataKey 
    DataMode 
    Data... 

PK是DataKey + DataMode
檢查約束:DataMode IN( 'L', 'd')--live或草案

您首先用DataMode =插入'D'--draft
當它啓動時,用INSERT SELECT將其複製到同一個表中,設置DataMode ='L'
總是編輯DataMode ='D',並將其推送到DataMode ='L '完成後。

時要顯示的數據傳遞的模式,使用WHERE DataKey = @ x和DataMode = @模式

我不知道你會如何處理刪除(草案刪除然後按該活?),你可能想添加一個狀態欄:在一個表中

DataStatus --'A'ctive 'D'eleted 

這樣做可以共同使用的所有SQL來爲不是「L」香港專業教育學院或「D'筏工作

0

我想。這是有效約會的主要候選對象,爲每個表添加開始日期和結束日期,如果當前日期在兩者之間開始和結束日期或開始日期之後,結束爲NULL記錄是活的。其他任何內容都不會顯示爲直播,因此您可以獲得草稿數據。

如果數據是連續的,並且要保留先前值的歷史,這將允許一組以上的草稿數據。或者,如果數據卷是一個問題,請在低數據庫工作負載時運行一項作業,以便使用enddate小於當前日期的方式刪除任何記錄。

1

兩個想法,根據情況而定。

如果某個數據在草稿版本捲入時仍然保持最新狀態,並且您只希望一次生成新的數據,則可以爲每個數據元素提供一個版本號,併爲當前活動版本號。然後編寫邏輯,以便選擇的記錄具有版本號< =當前版本號(忽略更高的版本號)。這將是低的中斷,也許處理你的意思是需要兩個版本可用。

如果要交換整個表格,並且可以簡短斷開連接(非常簡單),請重命名錶格。可能會比您描述的選項更具破壞性,並且可能允許同時訪問。

0

做任何你正在使用的鍵,默認爲N.如果要發佈一個布爾is_live列,只需更新該列Y.

有了這項工作將迫使你審查所有查詢這樣當他們不應該被看到時,他們就會過濾出草稿,但是會讓您不必維護兩張格式相同的表格。