2016-02-11 28 views
0

我使用web api 2和sql server爲電影/電視/演員等製作api。數據庫現在有> 30個表格,其中大多數存儲數據的用戶將能夠編輯。用類似維基函數的應用程序的數據庫設計

我應該如何存儲舊版本的條目?

說別人編輯電影表中的條目(電影)的描述,運行時和標語。

我會有一張表(movies_old),我在這裏將可編輯文件存儲在'電影'pluss中/編輯時。

全部在相同的數據庫中。 '??? _ old'表沒有關係。

我對數據庫設計很陌生。這有什麼明顯的錯誤嗎?

回答

1

在我看來,這裏有兩個問題:你在哪個表中存儲數據,以及在「歷史數值」字段中出現了什麼。

關於第一個問題,有兩個顯而易見的選項:將舊的和新的記錄存儲在同一個表中,並指出哪些是「當前」,哪個是「歷史」,或者有單獨的歷史表。

一張表的主要優點是你有一個更簡單的模式。如果表格包含許多字段,則尤其如此。如果有兩個表,那麼所有的字段定義都會被複制。將數據從當前表移動到歷史記錄表時,必須複製每個字段,並且如果字段列表發生更改或格式更改,則必須記住更新副本。任何顯示歷史的查詢都必須讀取兩個表。等等,但只要一張桌子,一切就會消失。將記錄從當前記錄轉換爲歷史記錄只是意味着更改「is_current」標記的設置,或者指示它。

兩張表的主要優點是:(a)訪問速度可能會稍快,因爲您沒有太多不相關的記錄可以跳過。 (b)閱讀當前表格時,您不必擔心排除歷史記錄。

呵呵,關於SQL的煩人的事情:原則上你可以在每條記錄上放一個日期,然後最新日期的記錄就是當前日期。在實踐中,這是一件痛苦的事情:通常你必須有一個內部查詢來查找最新的日期,然後將它反饋給外部查詢,以重新讀取該日期的記錄。 (例如,一些SQL引擎可以解決這個問題,例如Postgres)。因此,在實踐中,你需要一個「is_current」標誌,對於current來說可能是1,對於歷史或其他來說可能是0。

另一個問題是內容。如果您正在處理短字段,客戶號碼和金額等等,那麼簡單而容易的事情就是將完整的舊內容存儲在一條記錄中,並將全部新內容存儲在新記錄中。但是如果你正在處理一個長文本塊,比如劇情簡介或評論,那麼可能會有很多小編輯的改變。如果每次有人修復語法或拼寫錯誤,我們都會創建一個全新的記錄,其中包含全部1000個字符,其中5個字符是不同的,這可能會使數據庫變得非常混亂。如果是這種情況,您可能需要研究如何更有效地存儲更改。可能會或可能不會成爲您的問題。

+0

「(a)訪問速度可能會稍微加快一些,因爲您沒有太多不相關的記錄來跳過」 任何想法有多少? 5000 vs 100.000入口,速度提高2%?快30%? – v1dar

+0

如果您沒有可用的索引,那麼兩倍的記錄會使任何操作的時間增加兩倍。但是這個故事的寓意是:有一個可用的索引。然後,性能爲對數:將ADDS記錄的數量乘以運行時間。確切的公式取決於很多因素,但是您可能會發現,例如,每當您爲查詢添加1毫秒的記錄數時,每次都加倍這樣的事情。我不知道你期望數據庫有多大。實際上,在這成爲問題之前,您通常必須擁有數千萬條記錄。 – Jay

+0

性能比保持模式簡單更重要。我要用單獨的表格,以便我可以將條目(電影,人物等)ID保留爲索引。 感謝您的回答! – v1dar

相關問題