2015-11-08 22 views
2

我有問題!數據庫中的緩衝表,好還是不好?

我需要做一個大學項目,在這個項目中,我將有一個數據庫表是這樣的:

enter image description here

此表將具有記錄了很多!!!!!! 爲了管理這個,我需要創建一個驗證系統。

的是創建一個緩存表像這樣的最好的(爲什麼):

enter image description here

還是我的表中添加一列這樣的:

enter image description here

謝謝!

+0

「*很多記錄!!!!!! *」是什麼意思? –

回答

1

您的問題沒有足夠的信息提供真實的答案。以下是關於如何思考這種情況的一些指導。哪種方法取決於應用程序的性質,尤其取決於「驗證」的含義。

一個合理的解釋是「驗證」是工作流程的一部分,所以它只發生一次(或99%的時間只發生一次)。而且,當你看廣告時,你從不想看到未驗證的廣告。如果是這種情況,那麼通常會有關於驗證過程的附加信息。

這種情況預示了兩種合理的方法:

  • 做一個事務中進行驗證。如果驗證過程完全在數據庫中並且以秒爲單位進行測量,這將是合理的。
  • 爲正在驗證的廣告設置單獨的表格。也許甚至每個「用戶」或「實體」負責它們的單獨的表。根據驗證過程的性質,這可能是一個將它們提供給進行驗證的人員的隊列。

把它們放在「advertisements」表中是沒有意義的,因爲驗證過程中可能會包含額外的信息 - 誰,什麼,何處,何時,如何。

如果廣告可以多次驗證和失效,那麼最好的方法可能是將它們放在同一張表中。再次,有關於這個過程的性質的問題。

在沒有全表掃描的情況下訪問這兩個組是非常棘手的。如果10%的行被無效並且90%被驗證,則正常索引將需要全表掃描來讀取任一組。要更快地訪問較小的組,可以使用以下兩種方法:

  • 驗證標誌上的聚簇索引。
  • 驗證和無效行的單獨分區。

在這兩種情況下,更改記錄的驗證標誌都相對昂貴,因爲它涉及在不同數據頁面上讀寫記錄。除非每秒做出幾十次更改,否則這可能不是什麼大問題。

+0

而不是分區他可以創建一個有效的索引作爲領先的列以獲得100%的掃描效率。分區在這裏看起來像是一個核選項。沒有任何常見的功能,如刪除分區或不同的存儲可能是非常有用的。 – usr

+1

+1這實際上是考慮事情的正確方法。 @usr是否實用可能取決於一些外部因素 - 如果驗證實際上是要實施的真實工作流的一部分,那麼沒有理由不這樣做。這就是我所做的暗示在我的答案中,它可能會使編碼更加複雜 - 但是如果您需要應用程序代碼中的工作流程,那麼情況就是這樣。 – zxq9

+0

是的,如果工作流需要它,那肯定是一個加號,但它不會強制這個問題。爲工作流程的所有狀態提供單個表格可能非常方便。畢竟,「項目」是否被「驗證」不會改變項目的身份。這只是一個不同的狀態。例如:如果一個訂單可以處於10個狀態,則不會打開10個表。 – usr

1

這裏,不需要有單獨的「緩衝表」。你可以正確地索引valid字段。因此,以下索引基本上會自動創建一個緩衝表:

create unique index x on y (id) 
    include (all columns) 
    where (valid = 0) 

此索引創建尚未生效的數據的副本。你可以做很多變化,如

create unique index x on y (valid, id) 

真的不需要一個單獨的表。與分區或者手動分區相比,索引非常簡單。更少的工作,更普遍,更靈活和更少的潛在人爲錯誤。

+0

這是否合理完全取決於所使用的數據庫 - 並非所有數據庫系統都像其他數據庫一樣順暢地處理索引,特別是在複雜查詢中,智能不足的查詢計劃員可能會丟棄索引並對整個表執行順序掃描,要麼是因爲混亂的中間排序,要麼是由於調整成本估算不佳。 – zxq9

+0

是的。沒有考慮它,我認爲是SQL Server。但這種情況非常簡單,所以我不確定會出現什麼問題。你的例子原則上是有效的,但我覺得它們不太可能。索引一個單一的,顯然選擇性的列似乎是最簡單的事情。 – usr

0

這兩種方法都是有效的,哪種方法性能更好取決於您使用的數據庫的類型,而不是理論上使用布爾值還是將其分成兩個表格的理論問題。

我其實更喜歡分區方法(你的緩衝表的想法),但是附近編碼會更復雜。這可能是一個重要的考慮點。 大多數現代數據庫將很好地處理索引的布爾標準,但有時您可能會感到驚訝。

從發展的角度來看,目前最重要的事情是選擇一個並運行它,而不是在決定「正確」時癱瘓項目。

相關問題