2012-02-08 73 views
4

給定位置(城市)可以具有一個名稱以及其他可以用來識別的別名。我需要在數據庫中對此進行建模。如何在MySQL中爲具有別名的城市建模

搜索可以使用城市或任何它的別名來執行:

對於例如

市:

  • 名:洛杉磯
  • 別名:LA

在指定搜索條件,我可以指定LA或洛杉磯,它應該返回相同的結果(如好萊塢)。

我正在考慮使用一對多關係來實現,其中1個城市可以有多個別名,並且許多別名可以映射到一個城市。

在進行搜索時,我使用city和cityAlias表加入以查找正確的城市。

有沒有更好的方法來處理這個問題?

Image

編輯: (對於任何人誰運行到同樣的問題/要求和發生在談到這個頁面) 請參閱我的回答爲好,因爲我結束了使用,但標記答案可幫助您識別獨特的城市。

+2

我認爲你幾乎在正確的軌道上,禁止任何我不熟悉的SQL技巧。我會按照你的建議來完成它。 – Dervall 2012-02-08 07:08:57

+0

我知道我超過5年後纔來到這個:)但是你是如何處理刪除的(如果它是一個有效的用例)?即刪除城市vs刪除別名。你在應用程序代碼中處理了這個嗎? (我有類似的情況) – 2017-10-16 19:45:07

回答

6

我可以添加到您的解決方案的唯一的事情是,您可以先嚐試查找城市表中的完全匹配,如果沒有,然後加入別名。這樣你可以跳過一些相當昂貴的連接。

另一件需要注意的是,這個雙表解決方案可能會遇到重複條目的問題。我不是在談論不同城市的同一個別名(這可以用一個唯一的列進行檢查),而是與城市名稱匹配的別名。隨後詳細解釋這些「重複項」的例子:

城市

ID | Name 
--------- 
1 | Los Angeles 
2 | New York 

別名

ID | CityId | Name 
------------------ 
1 | 1  | LA 
2 | 2  | NY 
3 | 2  | Los Angeles 

我知道這不應該發生......但你知道穆爾定律:)這些交叉表重複項可能會在查找表中給您帶來麻煩(我猜想您正在使用它們作爲查看「猜測」城市實際嘗試選擇用戶時他/他e寫道「LA」)。但如果用戶寫下「洛杉磯」,則必須決定是否優先考慮城市或別名。我知道我提供的例子有點愚蠢,但作爲一個非美國公民,我無法提供更好的例子。但是在那裏有許多城市,每個城市都有許多別名......我不會冒險的:)

首先檢查城市表將使城市優先於其他城市的同名別名。或者,您可以在插入城市名稱之前檢查城市的別名是否已經存在。

這是所有我能想到的:)

+0

感謝您的洞察力。我不明白你的意思是'重複條目的麻煩'。你能詳細解釋一下嗎? – brainydexter 2012-02-08 07:34:28

+0

我添加了關於這些重複條目的詳細說明。希望有幫助 – 2012-02-08 07:48:37

+0

謝謝,這有幫助。我正在和別人討論這個問題,另一件事就是解決你說的話。在添加城市的時候,還要在別名表中創建一個具有相同cityName的別名。這樣,只需要在別名表中搜索。至於重複的條目,我想我會給這兩個選項給用戶,以選擇使用哪一個。 – brainydexter 2012-02-08 09:08:43

0

一些注意事項:

DestinationAlias表不需要代理鍵。 (idDestination, alias)(或相反)可以作爲PRIMARY KEY

爲了消除這兩個表中的(普通)的名稱和可能出現的問題的重複,你可以刪除從Destinationname列,並添加DestinationDefaultAlias表,具有DestinationAlias一個1:1關係(和隱含的1:1Destination關係):

CREATE TABLE DestinationDefaultAlias 
(idDestination 
, alias 
, PRIMARY KEY (idDestination) 
, FOREIGN KEY (idDestination, alias) 
    REFERENCES DestinationAlias (idDestination, alias) 
) 

當你要查找的默認名稱,您加入DestinationDestinationDefaultAlias。要搜索所有別名,請加入DestinationAlias

+0

我已將您的答案與其他答案結合起來,並提出瞭解決方案。你怎麼看呢 ? – brainydexter 2012-02-08 09:36:08

0

假設:

  • 拉Aguardia是隨機的城市名
  • LA是拉Aguardia
  • 洛杉磯的別名是紐約

  • 別名對於每一個城市加入,將城市名稱本身添加爲別名表的條目,因此我們只需要在別名表上進行搜索。

City表:

cityId | Name 
    1 | Los Angeles 
    2 | New York 
    3 | La Aguardia 

別名表:

cityId | AliasName 
    1 | Los Angeles 
    1 | LA 
    2 | New York 
    2 | NY 
    2 | Los Angeles 
    3 | La Aguardia 
    3 | LA 

用例1:

搜索LA:產率(cityID)=> [1, 3] =獨一無二> [Los Angeles,La Aguardia]

用例2:

搜索洛杉磯:產率(cityID)=> [1,2] =獨特> [洛杉磯,紐約]

用例3:

搜索紐約:收益率(cityID)=> [2,2] =唯一性> [紐約]

+1

這個味道像一個建議框:)所以你實際上允許重複顯示給用戶。如果是這種情況,那很好。我的解決方案實際上是爲了不允許重複的結果:通過在別名上應用UNIQUE索引並首先查看城市表(例如,如果查找「洛杉磯」,城市表將首先匹配)。現在,如果您可以返回多個結果,請繼續使用此結果,但請確保您在表格中的每個城市都有一個別名,並在添加新結果時記住這一點:) – 2012-02-08 09:51:53

+1

我並不專門開發這是一個建議框,但是是的,我認爲它也將用於該功能:)對於重複項,我想到了你說的話(特別是在這裏使用case1),並認爲最好讓用戶選擇他想要的一個。之後,如果我必須爲一個給定的別名確定一個獨特的城市,我想我肯定會編輯我的查詢以瞭解您的想法。 – brainydexter 2012-02-08 09:56:21

相關問題