Как моделировать города с псевдонимами в MySQL - PullRequest
4 голосов
/ 08 февраля 2012

Заданное местоположение (город) может иметь имя, а также другие псевдонимы, по которым оно может быть известно. Мне нужно смоделировать это в базе данных.

Поиск может быть выполнен с использованием либо города, либо любого его псевдонима:

Например,

Город:

  • имя: Лос-Анджелес
  • псевдоним: LA

При указании критерия поиска я могу указать либо Лос-Анджелес, либо Лос-Анджелес, и он должен вернуть тот же результат (например, Голливуд).

Я думал о том, чтобы сделать это, используя отношение «один ко многим», когда в одном городе может быть много псевдонимов, а многие псевдонимы могут отображаться в одном городе.

При поиске я использую объединение таблиц city и cityAlias, чтобы найти правильный город.

Есть ли лучший способ справиться с этим?

image

EDIT: (Для тех, кто сталкивается с той же проблемой / требованиями и попадает на эту страницу) Пожалуйста, посмотрите мой ответ, так как я в конечном итоге использовал его, но помеченный ответ помогает вам определить уникальные города.

Ответы [ 3 ]

6 голосов
/ 08 февраля 2012

Единственное, что я могу добавить к вашему решению, это то, что вы можете сначала попытаться найти точное совпадение в таблицах городов, а если его нет, затем присоединиться к псевдониму.Таким образом, вы можете пропустить некоторые довольно дорогие объединения.

Еще одна вещь, на которую стоит обратить внимание, - это решение с двумя таблицами может иметь проблемы с дублированными записями.Я говорю не об одних и тех же псевдонимах для разных городов (это можно проверить по уникальному столбцу), а об псевдонимах, соответствующих названиям городов.Пример этих «повторяющихся записей» сопровождается подробным объяснением:

Города

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

Псевдонимы

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

Я знаю, что этого не должно случиться ... но вы знаете законы Мура :) Эти дубликаты перекрестных таблиц могут вызвать проблемы в справочной таблице (я полагаю, что вы используете их как средство поиска, чтобы «угадать», что на самом деле имеет город)попытался выбрать пользователя, когда он написал "LA").Но если пользователь написал «Лос-Анджелес», вам придется решить, стоит ли отдавать приоритет городу или псевдониму.Я знаю, что пример, который я привел, немного глуп, но как неамериканский гражданин я не могу привести лучшие примеры.Но есть много городов с множеством псевдонимов для каждого ... Я бы не стал рисковать:)

Проверка сначала таблицы города даст приоритет городу над равным псевдонимом для другого города.Или вы можете проверить, присутствует ли псевдоним для города в качестве названия города, прежде чем вставлять его.

Это все, что я могу придумать:)

0 голосов
/ 08 февраля 2012

Предположение:

  • La Aguardia - это случайное название города
  • LA - псевдоним La Aguardia
  • Лос-Анджелес - псевдоним NewЙорк

  • Для каждого добавленного города добавьте само название города в качестве записи в таблицу псевдонимов, поэтому нам нужно искать только в таблице псевдонимов.

Таблица городов:

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] = уникальный> [Лос-Анджелес, Ла-Агуардия]

Вариант использования 2:

Поиск в Лос-Анджелесе : выходы (cityID) => [1, 2] = уникально> [Лос-Анджелес, Нью-Йорк]

Вариант использования 3:

Поиск Нью-Йорка : выходы (cityID) => [2,2] = уникальный> [Нью-Йорк]

0 голосов
/ 08 февраля 2012

Некоторые заметки:

Таблица DestinationAlias не нуждается в суррогатном ключе. (idDestination, alias) (или наоборот) может служить PRIMARY KEY.

Чтобы исключить дублирование (общих) имен в обеих таблицах и проблемы, которые могут возникнуть, вы можете удалить столбец name из таблицы Destination и добавить таблицу DestinationDefaultAlias, имеющую 1:1 связь с DestinationAlias (и подразумеваемая 1:1 связь с Destination):

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

Если вы хотите найти имя по умолчанию, вы присоединяетесь к Destination с DestinationDefaultAlias. Чтобы найти все псевдонимы, вы присоединяетесь к DestinationAlias.

...