2012-11-03 44 views
1

我的數據庫包含兩個表格,一個是城市距離矩陣,另一個是城市。我的第一個結構是這樣的:在數據庫中組織主鍵的更好方法是什麼?

    • UUID
    • 名稱
    • 緯度
    • 經度

  • 距離
    • FromCityID
    • ToCityID
    • DistanceLength

UUID是城市表,FromCityIDToCityID參考CITY各自外鍵的主鍵,又都是複合DISTANCE表的主鍵,因爲兩個城市之間的距離應該是唯一的。

但後來意識到我不想使用UUID和自動增量作爲主鍵,因爲我從XML數據上載數據,XML包含城市和距離。而距離可能不僅包括那些在當前XML中提到的城市,而且還包括之前從數據庫中存儲的城市。

我需要一個跨數據庫和XML的ID相同的系統。經/緯度似乎是最好的選擇,所以我改變了我的表,這樣的:

    • 名稱
    • 緯度
    • 經度

  • 距離
    • FromCityIDLatitude
    • FromCityIDLongitude
    • ToCityIDLatitude
    • ToCityIDLongitude
    • DistanceLength

LatitudeLongitude是城市表的複合主鍵; FromCityIDLatitude/FromCityIDLongitudeToCityIDLatitude/ToCityIDLongitude將CITY分別作爲外鍵,並且所有四列都是DISTANCE表的複合主鍵。

但是,使用4列作爲主鍵是一個糟糕的設計。這種情況下最好的是什麼?

回答

3

我不同意這樣的說法:

但它是一個糟糕的設計使用4列作爲主鍵。

一個糟糕的設計是不能滿足您需要的或者允許數據庫不一致的設計。在你的情況下,只要我們做出一個假設,我就不會看到四列主鍵的問題。也就是說,此表的主要訪問路徑將使用主鍵中的每個列。如果是這種情況,那就沒問題;我會把整個表放到一個唯一的索引中,並在你的密鑰的四列上設置一個單獨的唯一約束。

四列索引的問題是當您嘗試通過第四頁訪問表時。你可能根本不會使用索引。如果隨後有必要定期在第四頁上進行索引查找,則必須添加另一個索引等。最後可能會得到一個可笑的索引過多的表。

它的方式是錯開加載。不要將XML數據直接加載到主數據庫表中。將它們加載到輔助表中並運行一個過程來查看這個城市是否已經存在。如果確實如此,請不要添加它。如果沒有,則生成一個新的代理鍵並執行CROSS JOIN將所有新記錄添加到DISTANCE。

+0

謝謝你的建議! 「第四片葉子」是什麼意思? – user1788867

+0

沒問題:-)。在你的情況下,第四頁將是PK的第四列「ToCityIDLongitude」。 – Ben

+0

我會給予好評這一點,如果不是因爲赤裸裸的,但可惜與指標混爲一談按鍵都太常見的誤解/混淆。關鍵是唯一性約束,是邏輯層次的構造。索引是數據庫物理組織的一個組成部分。鍵和索引幾乎沒有相同的東西,他們甚至不必以「1對1」的意義出現。並不是每個關鍵碼都需要通過自己的索引來實施,索引主要不是用來支持關鍵碼。 –

0

要回答你的標題提出的問題,

什麼是更好的在數據庫中組織主鍵的方法?

盲鍵,無論是整數還是通用唯一標識符,幾乎總是更好的鍵。他們永遠不需要改變。數據元素可能會也可能不會改變。

在您的特定情況下,一個城市的緯度和經度是不可能改變的。但是,如果您收到一個城市的緯度/經度更正,您現在必須在兩個表格中進行更正。

相關問題