2012-02-08 5 views
4

주어진 위치 (도시)에는 이름 및 알 수있는 다른 별칭이있을 수 있습니다. 데이터베이스에서 이것을 모델링해야합니다.MySQL에서 별칭을 사용하여 도시를 모델링하는 방법

도시 또는 그 별칭 중 하나를 사용하여 검색을 실행할 수 있습니다.

도시 :

  • 이름 : 로스 앤젤레스
  • 별칭 : LA

검색 기준을 지정할 때, 나는 LA 또는 로스 앤젤레스를 지정할 수 있습니다, 그것은 동일한 결과를 반환해야합니다 (예 : 할리우드).

1 개의 도시가 많은 별칭을 가질 수 있고 많은 별칭이 하나의 도시로 매핑 될 수있는 일대 다 관계를 사용하여이를 수행하려고 생각했습니다.

검색 할 때 city와 cityAlias ​​테이블을 결합하여 올바른 도시를 찾습니다.

더 나은 방법이 있나요?

Image

편집 : 나는 그것을 사용하여 종료 이후 뿐만 아니라 내 대답을 참조하십시오하지만 (같은 문제/요구 사항으로 실행되는이 페이지에 오는 일이있는 사람들을위한) 표시된 답변은 독특한 도시를 식별하는 데 도움이됩니다.

+2

나는 당신이 옳은 길을 가고 있으며 내가 익숙하지 않은 SQL 속임수를 사용하고 있다고 생각한다. 나는 당신이 제안한대로 그렇게했을 것입니다. – Dervall

+0

나는 5 년 이상이 지났음을 알고 있습니다 :) 그러나 어떻게 삭제를 처리 했습니까 (유효한 유즈 케이스라면)? 즉 도시 삭제와 별칭 삭제 중 하나입니다. 애플리케이션 코드에서 이것을 처리 했습니까? (비슷한 경우가 있습니다) –

답변

6

내가 솔루션에 추가 할 수있는 유일한 사항은 도시 테이블에서 정확한 일치 항목을 먼저 찾을 수 있고 어떤 것이 없으면 별칭 하나에 합류 할 수 있다는 것입니다. 그렇게하면 꽤 비싼 조인을 건너 뛸 수 있습니다.

두 번째 주목할 점은이 이중 테이블 솔루션이 중복 된 항목에 문제가있을 수 있다는 것입니다. 나는 다른 도시에 대한 동일한 별칭 (고유 한 열로 확인할 수 있음)을 말하는 것이 아니라 도시 이름과 일치하는 별칭을 말하는 것입니다. 자세한 설명은 다음이 "중복 된 항목"의 예 :

도시

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

별칭

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

나는 이런 일이 안 알아 ...하지만 당신은 무어의 법칙을 알고 :) 이러한 크로스 테이블 복제본은 조회 테이블에서 문제를 일으킬 수 있습니다 (내가 생각할 때 City가 사용자를 선택하려고 실제로 시도한 것을 "추측"한 것으로 생각합니다). e는 "LA"라고 썼다). 그러나 사용자가 "로스 앤젤레스"를 쓴 경우 도시 또는 별칭의 우선 순위를 결정해야합니다. 내가 제공 한 예가 다소 바보 같지만 비 미국 시민으로서 나는 더 좋은 예를 제시 할 수 없다는 것을 안다. 그러나 각 도시마다 많은 별칭이 있습니다. 나는 기회가 없을 것입니다.

먼저 도시 표를 확인하면 도시가 다른 도시의 별칭이 지정된 별칭보다 우선합니다. 또는 도시의 별칭이 도시 이름으로 삽입되어 있는지 여부를 확인할 수 있습니다.

DestinationAlias 테이블 대용 키를 필요로하지 않는다 : 나는 :)

+0

통찰력을 가져 주셔서 감사합니다. 나는 당신이 그곳에서 무슨 의미인지 이해하지 못했습니다. 좀 더 자세히 설명해 주시겠습니까? – brainydexter

+0

중복 된 항목에 대한 자세한 설명을 추가했습니다. 희망이 도움이 –

+0

고마워, 그 도움이.나는 이것을 다른 누군가와 논의하고 있었는데, 당신이 말한 것을 풀기 위해 또 다른 일이 생겼다. 도시를 추가 할 때 같은 cityName을 가진 별칭 테이블에 별칭을 만들 수도있다. 그 방법은, 별칭 테이블에서 검색 할 필요가 있습니다. 중복 항목에 관해서는, 내가 사용할 옵션을 선택하기 위해 두 옵션을 사용자에게 제공 할 것입니다. – brainydexter

0

일부 노트 생각할 수있는 전부

. (idDestination, alias) (또는 그 반대)은 PRIMARY KEY으로 사용할 수 있습니다.

두 테이블의 (일반) 이름과 발생할 수있는 문제의 중복을 제거하기 위해, 당신은 Destination 테이블에서 name 열을 제거 할 수 있으며 DestinationAlias1:1 관계를 가지고하는 DestinationDefaultAlias 테이블을 추가 (그리고는 암시 Destination1:1 관계) : 기본 이름을 찾을하려는 경우

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

, 당신은 DestinationDefaultAliasDestination 가입 할 수 있습니다. 모든 별칭을 검색하려면 DestinationAlias으로 가입하십시오.

+0

저는 답을 다른 답과 결합하여 해결책을 제안했습니다. 그거에 대해서 어떻게 생각해 ? – brainydexter

0

은 가정 :

  • 라 Aguardia는
  • LA 라 Aguardia
  • 로스 앤젤레스의 별칭입니다 임의의 도시 이름은 모든 도시가 추가 뉴욕

  • 의 별칭입니다 별칭 테이블에 항목으로 도시 이름 자체를 추가하면 별칭 테이블에서만 검색하면됩니다.

도시 테이블 :

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 :

뉴욕에 대한 검색 : yields (cityID) => [2,2] = 고유> [New York]

+1

이것은 제안 상자와 같은 냄새가 나기 때문에 실제로 사용자에게 중복을 허용합니다. 그럴 경우 위대한입니다. 내 솔루션은 실제로 별칭에 UNIQUE 인덱스를 적용하고 도시 테이블을 먼저 찾음으로써 중복 결과를 허용하지 않기위한 것입니다 (예 : 도시 테이블이 먼저 일치하는 "로스 엔젤레스"를 찾는 경우). 이제 하나 이상의 결과를 반환 할 수 있다면이 도시에 대한 별칭을 가지고 있는지 확인하고 새로운 도시를 추가 할 때 염두에 두십시오. –

+1

특별히 개발하지는 않았습니다. 이 제안 상자에 대한 그래, 그래, 난 그 기능뿐만 아니라 사용됩니다 :) 중복에 관해서는, 나는 당신이 말한 것에 대해 생각했다 (특히 여기 case1을 사용), 그리고 그것이 사용자가 원하는 것을 선택하십시오. 나중에 특정 별칭에 대해 고유 한 도시를 식별해야하는 경우 귀하가 말한 것에 대한 쿼리를 확실히 편집 할 것입니다. – brainydexter

관련 문제