2009-06-19 113 views
2

每當我有一些記錄/對象,我想按某種順序,我通常會創建一個名爲Ordinal的字段。哪些數據類型用於序號?

我經常想知道對序號字段使用整數還是小數值會更好。

這是一個考慮移動對象在順序中的不同位置時:

  • 如果使用連續的整數,你要做的所有的序數的(或至少是一些嚴重的返工在被移動的對象的原始位置之前的序列)。

  • 如果使用整數但將其間隔(可能爲1000個間隔),則可以將序號更改爲要移動對象的周圍對象之間的中點值。這可能會失敗,如果在最後的連續整數結束的地方。

  • 如果您使用十進制數字,您可以找到環繞對象的序數的平均值並將其用於要移動的對象。

  • 也許它可以使用一個字符串,但我可以看到變得非常愚蠢。

我確定還有其他因素我沒有想過。 你使用什麼,爲什麼?

+0

我剛剛發現了一個類似的問題。查看我的更新鏈接。 – kemiller2002 2009-06-21 12:27:23

回答

1

「這可能會失敗,如果某個地方你最後連續的整數。」

對於這種情況(可能是罕見的,因此不是性能重要)的情況下,您可以實現一個重新編號的方法,它可以再次隔開。當我用COMAL進行編程時(任何人都知道那種語言?),你可以用行號來做這件事。

0

我記得這是一個類似的問題,以前的帖子。它可以在這裏找到:

SQL Server Priority Ordering

鏈表,仍能正常工作,但這是一個更容易的解決方案,如果你不想跟蹤父子關係。

聽起來像你想要的是一個鏈表。這樣,你總是知道接下來會發生什麼,而且你不必猜測。所以位置字段將是一個指向它後面的對象的指針。

我一直在使用任意數字來表示位置的問題是,它可能會很快下降到熵。如果更多的項目被添加並且數字變得連續,等等等等。如果項目列表改變位置,它可能很快變得難以管理。

要在sql server表中實現這個,請添加與主鍵具有相同數據類型的另一個字段。如果該字段爲空,則它是列表中的底部元素。如果要在同一個表中存儲多個列表,則可能需要添加另一個名爲ListID的字段,它指定具有相同ListID的所有行屬於同一個列表。所以像這樣的東西。

Table: 
ID INT 
ListID INT 
Child INT 

Pararent Row For first list: 
1, 1, 2 
First Child 
2, 1, 3 
Second Child 
3, 1, NULL 

Parent Row for second list: 
4, 2, 5 
First Child 
5, 2, 6 
Second Child 
6, 2, NULL 

你可能需要做的每次添加行,它可以是一個有點乏味時間的插入和更新,但它總會讓列表排隊。

+0

有趣。對我來說這是一個新概念。你將如何在SQL Server數據庫中實現這一點? – 2009-06-19 15:39:45

0

我曾經爲這種類型的字段使用小數類型來在表中排序記錄,我們實際向客戶公開了這些記錄,以便他們可以設置自己的訂單。雖然聽起來很俗氣,但我們的客戶喜歡它;他們發現它非常直觀。他們很快就發現他們可以使用21.5這樣的數字在21到22之間移動。

也許是因爲他們是會計師。

-1

基於表外數據的「特定順序」?如果是這樣,爲什麼不包含它,所以你可以動態地進行排序?如果它已經在表格中,添加一個字段是多餘的。

2

小數似乎很好地解決了你的問題。由於小數只是10個浮點數,所以實際上有很多可用的數字。除非你已經看到了你已經出現在不少位數的情況,並且有理由懷疑無限數量的數字是必要的理由,否則我會讓它騎。

如果您確實需要替代方案,但沒有看到需要堅持使用基本數據,則可以使用tumbler arithmetic。基本的想法是,它是在每個位置無限可擴展的地方符號。在概念上很簡單。

0

我使用整數,只需在需要在訂單中插入新項目時重新排列。由於您可以通過單個更新語句創建必要的差距,因此它相當簡單。但是,我只在最多幾十行的查找表上完成了這個工作,顯然這比較糟糕。但是我想說,如果你需要爲大量行解決這個問題,維護訂單的過程應該是程序化的,這使得數據類型的選擇在很大程度上是沒有意義的。

相關問題