2010-01-08 73 views
3

我想弄清楚什麼要調用我的數據庫表中保存INT到特定「記錄版本」的列。我目前使用「RecordOrder」,但我不喜歡那樣,因爲人們認爲更高=更新,但是我使用它的方式,更低=更新(以「1」爲當前記錄,「2 「成爲第二最新的」,「3」更老,等等)。我認爲「RecordVersion」,但我恐怕會有同樣的問題。還有其他建議嗎? 「RecordAge」?什麼名稱列在數據庫表中保存版本號

我這樣做是因爲當我插入到表中時,而不必知道下一個版本是什麼,然後運行在編寫之前從我那裏竊取的編號的風險,我只是插入帶有「 RecordOrder「爲0.表AFTER INSERT上的觸發器將該鍵的所有」RecordOrder「數字遞增1,因此我剛剛插入的記錄變爲」1「,其他所有記錄都增加1.這樣,您可以通過選擇RecordOrder = 1來獲取某人的當前記錄,而不是獲取MAX(RecordOrder),然後選擇該記錄。

PS -我也接受批評爲什麼這是一個可怕的想法,我應該增加這個指數。這似乎使查找更容易,但如果這是一個壞主意,請賜教!

有關數據的一些細節,作爲一個例子:

我有以下的數據庫表:

CREATE TABLE AmountDue (
    CustomerNumber INT, 
    AmountDue  DECIMAL(14,2), 
    RecordOrder SMALLINT, 
    RecordCreated DATETIME 
) 

我的數據的一個子集是這樣的:

CustomerNumber Amountdue  RecordOrder     RecordCreated 
      100   0    1  2009-12-19 05:10:10.123 
      100  10.05    2  2009-12-15 06:12:10.123 
      100  100.00    3  2009-12-14 14:19:10.123 
      101   5.00    1  2009-11-14 05:16:10.123 

在這個例子中,客戶100有三行 - 他們欠了100美元,然後是10.05美元,現在他們什麼也沒欠。讓我知道是否需要再澄清一點。

UPDATE:

的「RecordOrder」和「RecordCreated」列不提供給用戶 - 他們只是有供內部使用,並幫助找出哪些是當前的客戶記錄。此外,我可以用它來返回適當的客戶歷史記錄,儘管我可以輕鬆地在日期上做到這一點。我可以完成同樣的事情,只是使用RecordCreated日期遞增的「Record Version」(記錄版本),但是這消除了瞭解RecordOrder = 1是否爲當前記錄的便利性,然後我回到了執行子查詢MAX或MIN在DateTime上確定最近的記錄。

+1

+1關心比我的DBA更多。 – iandisme 2010-01-08 19:59:01

回答

3

我認爲「當前版本= 1」是一個壞主意,因爲當你添加一個新的當前記錄時,你將不得不更新所有以前的版本。而任何引用舊版本號的表或應用程序現在都會出錯。我必須編寫一個與大型機程序接口的服務,這是一個非常頭疼的事情,浪費了幾十個開發人員的時間。

我通常使用version_id字段進行版本控制,每次只會增加一次。然後,當我想查找最新記錄時,我在order by version_id desc中查詢並僅選擇第一行。

編輯:我沒有看到iandisme剛纔指出的datawarehousing標籤。如果選擇所有版本都不起作用,我已經看到一些系統保留了一個單獨的表格,這些表格僅僅爲另一個表格中的每條記錄存儲了最新的版本。因此,當新版本添加到Record表中時,相應的RecordVersion記錄會更新以存儲該新版本。對於我所從事的工作來說,這一直是過分的,但我不會在整個數據倉庫上工作,所以我不知道這是否會更好或更糟。

+0

+1因爲我通常這樣做。儘管如此,如果這張表的搜索比insert更普遍,rwmnau的方法可能比在每個搜索上運行MAX彙總更高效一些。由於他標記了數據倉庫,這可能是真的。 – iandisme 2010-01-08 19:58:18

+0

我無法做一個「order by version_id DESC」,因爲只有當我查找單個客戶的當前記錄時纔有效。我經常從這個表中抽出大量客戶,所以如果我增加數字,那麼使用MAX(版本)的嵌套查詢是我唯一的選擇 - 這就是爲什麼我選擇「向後」這樣說。我有一種感覺,這是不友善的,因此,問題:) – SqlRyan 2010-01-08 20:15:46

0

你說的是年齡而不是版本,所以你可以稱之爲RecordAge。但我會完全擺脫它,因爲你似乎想要做的就是獲得特定客戶的最近訂單。

這可以通過使用客戶號碼和日期/時間字段來實現。如果你將這兩個組合作爲一個唯一的約束條件,並在你的客戶代碼中加上重試邏輯,那麼你很可能會遇到競爭條件,所以你應該沒有問題。

插入一個觸發器修改大量記錄的想法是一個壞主意,因爲隨着記錄的添加,它變得越來越昂貴。

非常關鍵地注意任何引入像版本號這樣的任意列的設計。它實際上是一個派生屬性(取決於其他屬性,在這種情況下是客戶編號和日期),儘管出於性能原因這樣做也可以,但只有在瞭解其後果的情況下才能緩解特定問題。

我無法看到使用日期中的小整數作爲抵消觸發器成本的性能改進,但與所有數據庫決策一樣,度量,請勿猜測

1

爲什麼你不能使用RecordCreated日期來完成基本相同的事情?

做這樣的事情:

select top 1 columna, columnb, etc. from table order by RecordCreated desc 

會給你最新的記錄,你會不會擔心創紀錄的修改。

您可能會導致記錄重新編號方法(索引爭用,鎖升級等)的各種問題。

鎖升級:http://msdn.microsoft.com/en-us/library/aa213033(SQL.80).aspx

指數爭:http://blogs.digineer.com/blogs/jasons/archive/2009/02/25/monitoring-index-contention-with-dmfs.aspx

正如其他人在關於數據倉庫所提到的,你總是可以把一個視圖或快照或數據集的頂部類似的東西給你以您想要的格式輸出數據(僅限最新的記錄等)。顯然我不太瞭解你的約束或要求,足以知道view/snapshot /等。在你的情況下有意義。

0

好吧,我看到這個問題是,你會浪費很多數據庫處理時間重新編號。另外,我不知道你是否將recordOrder公開給用戶,但是如果你是他們,他們會希望能夠使用該號碼詢問關於它的問題,並且不斷變化將會令人困惑和惱人。當然,你已經指出的問題在哪裏,訂單不是未來開發商可能期望的。

爲什麼不只是使用一個標識字段,然後編號將是自動的(那麼在你插入之前,它將永遠不會是一個竊取號碼的問題)。只要您可以通過id desc和客戶編號來查看一個人的所有記錄,是否重複每個客戶的編號?或者您可以使用記錄日期字段來訂購記錄。

2

而不是使用整數來指定行的哪個版本是最新版本,我認爲您應該使用具有當前時間默認值的TimeStamp字段。

這樣,無論誰在什麼時候添加一行,關於該行的最新版本都不會有歧義。

我想重新編號所有相關行ID + 1是不是有多個原因是一個好主意:

  1. 你正在改變的東西,就沒有必要改變
    • 鎖定和阻塞會增加
    • 使用比需要更大的處理能力和存儲器
+0

好主意! +1 您將意義加倍,顯示哪個記錄是最後一個記錄,以及編輯發生的時間。 – 2010-01-08 20:21:44

0

我喜歡Raj More使用時間戳的想法。 但是我意識到任何查詢最新記錄的查詢都很困難,並且會導致大量的處理。
所以我會建議這個想法:使用時間戳記(它有無論如何)的記錄順序, ,但保留一個字節的字段,以輕鬆識別最新記錄。
在這種情況下,您將擁有當前記錄的最新記錄值= 1,而其他記錄= NU11。這樣你可能會創建一個忽略空值的索引?
這將大大簡化您的所有查詢。

相關問題