使用浮點數進行 PK。這是個好主意嗎?
假設我有一個實體
PizzaStore
,它有一個位置作為其屬性的一部分現在一個
PizzaStore
可以有 N 個其他PizzaStore
的在附近。所以似乎是一個自引用關係 1-N(可選)
如果我們事先知道哪個確切
PizzaStore
是彼此接近的,那麼表示它的最佳方式是什麼?由於我們有一個自引用的 1-N 關係,我認為需要另一個表。
<pizza_store_id, other_pizza_store_close_by_id>
在這種情況下,我們將儲存 eg
<1, 22>, <1, 23>, <1, 78>, <2, 102>
etc 以顯示 id 為 1 的披薩店附近有 22、23 和 78 等現在為了讓這些行按順序恢復,我需要創建一個 PK 並基於它進行查詢。
我想知道自動增量會保證插入順序嗎?
或者我是否需要使用表示距離的浮點數,例如
<2.04, 1, 23>
(其中 2.04 是以英里為單位的距離)我還在想有沒有比這更好的方法?
我們知道 if
1
is close to22
then22
也接近了1
吧?有沒有更有效的方式來表示這些資訊?
我認為只儲存
<1,22>
要擷取的行就足夠了,並且1
接近. 但是這樣我們就失去了訂單22``22``1
更新:
所有答案都非常有用。但有一件事可能還不清楚。
我已經有了基於插入時間距離的實體順序。即,我有一組已經
根據距離排序 的對象的 id,我想將這個集合插入數據庫中,以便我可以按照插入它們的順序檢索行。我想避免在檢索時對距離進行排序,因為我在插入時已經有訂單。這些 id 將用於加入另一個表(它們是 id),我想按插入順序檢索行
直接回答您的問題:不。使用浮點數作為主鍵不是一個好主意。為什麼?因為浮點數可能會遇到舍入和精度問題(1.20 與 1.2 相同嗎?因為在數學上是。)
我個人會在單個欄位上創建一個主鍵。最好是整數。整數通常比浮點數更有效,並且對於浮點數和字元串的解釋沒有歧義。
主鍵最重要的功能是唯一標識表中的一行。除此之外,它不必有任何意義或目的。如果它用於其他目的,那就是獎金。
在您的情況下,(正如您的標題所暗示的那樣)我不會將距離用作主鍵(單獨使用),因為兩個商店組合的距離可能相同。
您可以將其用作複合鍵的一部分。但在此範例中,除非您想儲存相同 2 個商店之間的多個距離,否則它沒有意義。
更進一步:在我看來,這就像一個空間查詢問題。如果您為每個商店儲存一個 XY 座標,那麼您可以執行諸如半徑搜尋之類的操作。“給我一份距離為 1 英里、2 英里、5 英里、10 英里的披薩店的列表”等。或者更好的是,從客戶地址中,您可以確定哪家店離您最近。
如果添加了新商店,它將自動包含在結果集中,而無需手動計算距離。您還可以計算每個商店之間的距離。
我能想到的這種方法的唯一缺點是距離是直線,可能無法準確反映您可能必須通過公路在商店之間行駛的距離。
根據您要實現的目標,儲存距離而不是重新計算距離可能很有用,但我個人更喜歡根據需要導出值。
公平地說,我對 sqlite 一無所知,但將其嚴格視為我會遇到的設計問題
<storeid1, storeid2, distance>
用一個主鍵就三者的組合。該表不會經常更改(僅在新商店到來時),並且兩個商店之間的距離永遠不會改變,因此您不必擔心插入太多。這種組合也必須是獨一無二的。
您可以在 storeid2 上添加一個正常索引以在該列上進行搜尋,或者確保包括兩個方向。所以:
<1,22,4.02> <22,1,4.02>
是的,這將使您的規模翻倍,但您將擁有多少個商店組合?即使有數百家商店並保留所有可能的組合,它仍然不會是一張巨大的桌子。現在,如果您有數以千計的商店並且想要保留每個組合(不僅僅是最近的 10 家,或者 50 英里內的所有東西),那麼您可能會遇到問題。