2012-02-08 4 views
4

Un emplacement donné (ville), peut avoir un nom et aussi d'autres alias par lesquels il peut être connu. J'ai besoin de modéliser cela dans une base de données.Comment modéliser des villes avec des alias dans MySQL

Recherche peut être exécuté en utilisant soit la ville ou de son alias:

Pour exemple

Ville:

  • nom: Los Angeles
  • alias: LA

Lorsque vous spécifiez le critère de recherche, je peux soit spécifier Los Angeles ou Los Angeles, et il devrait retourner le même résultat (par exemple Hollywood). Je pensais le faire en utilisant une relation Un-à-Plusieurs où une ville peut avoir plusieurs alias, et de nombreux alias peuvent être mappés à une ville. Lorsque j'effectue une recherche, j'utilise une table de jointure de city et cityAlias ​​pour trouver la ville correcte.

Y a-t-il une meilleure façon de gérer cela?

Image

EDIT: (Pour tous ceux qui se jette dans le même problème/besoins et arriver à vient à cette page) S'il vous plaît voir ma réponse aussi bien, depuis que je fini par utiliser, mais la réponse marquée vous aide à identifier des villes uniques.

+2

Je pense que vous êtes sur la bonne voie, interdire toute supercherie avec laquelle je ne suis pas familier. Je l'aurais fait comme tu le suggères. – Dervall

+0

Je sais que j'y arrive après plus de 5 ans :) mais comment avez-vous géré la suppression (si c'était un cas d'utilisation valide)? c'est-à-dire supprimer une ville ou supprimer un alias. Avez-vous géré cela dans le code de l'application? (J'ai un cas similaire) –

Répondre

6

La seule chose que je peux ajouter à votre solution est que vous pouvez essayer d'abord de chercher la correspondance exacte dans les tables de la ville et s'il n'y en a pas, alors de se joindre à l'alias. De cette façon, vous pouvez ignorer certaines jointures qui sont assez chères.

Une autre chose à noter est que cette solution de table double peut rencontrer des problèmes avec les entrées dupliquées. Je ne parle pas des mêmes alias pour différentes villes (ceci peut être vérifié avec une colonne unique), mais des alias correspondant aux noms des villes. Exemple de ces "entrées en double", suivi d'une explication détaillée:

Villes

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

Alias ​​

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

Je sais que cela ne devrait pas arriver ... mais vous savez les lois de Moore :) Ces doublons de table croisés peuvent vous donner du fil à retordre dans une table de recherche (j'imagine que vous les utilisez comme un look pour "deviner" ce que City a réellement essayé de sélectionner quand il/elle e a écrit "LA"). Mais si l'utilisateur a écrit "Los Angeles", vous devrez décider s'il faut donner la priorité à la ville ou à l'alias. Je sais que l'exemple que j'ai donné est un peu stupide, mais en tant que citoyen non américain, je ne peux pas donner de meilleurs exemples. Mais il y a beaucoup de villes avec beaucoup d'alias pour chacun ... Je ne prendrais pas de chance :)

En cochant d'abord la table de la ville donnera la priorité à la ville sur un alias nommé égal pour l'autre ville. Vous pouvez également vérifier si un alias d'une ville est déjà présent en tant que nom de ville avant de l'insérer.

C'est tout ce que je peux penser :)

+0

Merci pour la perspicacité. Je n'ai pas compris ce que vous entendiez par «problème avec les entrées dupliquées». Pouvez-vous en dire un peu plus à ce sujet? – brainydexter

+0

J'ai ajouté une explication détaillée sur ces entrées en double. J'espère que ça aide –

+0

Merci, ça m'a aidé.Je discutais avec quelqu'un d'autre, et une autre chose est apparue pour résoudre ce que vous avez dit .. Au moment de l'ajout d'une ville, créez également un alias dans la table alias avec le même cityName. De cette façon, il suffit de chercher dans la table des alias. Comme pour les entrées en double, je suppose que je vais donner les deux options à l'utilisateur, pour sélectionner celui à utiliser. – brainydexter

0

Quelques notes:

Le tableau DestinationAlias n'a pas besoin d'une clé de substitution. Le (idDestination, alias) (ou l'inverse) peut servir de PRIMARY KEY.

Pour éliminer la duplication des noms (communs) dans les deux tables et les problèmes qui pourraient se produire, vous pouvez supprimer la colonne name de la table Destination et ajouter une table DestinationDefaultAlias, ayant une relation 1:1 avec DestinationAlias (et un implicite 1:1 relation avec Destination):

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

Lorsque vous voulez trouver le nom par défaut, vous joindre Destination avec DestinationDefaultAlias. Pour rechercher tous les alias, vous vous connectez avec DestinationAlias.

+0

J'ai combiné votre réponse avec d'autres réponses et trouver une solution. Qu'en pensez-vous ? – brainydexter

0

Assomption:

  • La Aguardia est un nom de ville au hasard
  • LA est un alias de La Aguardia
  • Los Angeles est un alias de New York

  • Pour chaque ville ajouté , ajoutez le nom de la ville en tant qu'entrée à la table des alias, nous n'avons donc qu'à faire une recherche sur la table des alias.

table Ville:

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

table Alias:

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

Cas d'utilisation 1:

Rechercher LA: les rendements (CityID) => [1, 3] = unique> [Los Angeles, La Aguardia]

Cas d'utilisation 2:

Rechercher Los Angeles: rendements (CityID) => [1, 2] = EXCLUSIVES> [Los Angeles, New York]

Cas d'utilisation 3:

Recherche de New York: rendements (cityID) => [2,2] = unique> [New York]

+1

Cela sent comme une boîte de suggestion :) Donc, vous autorisez réellement les doublons à afficher à l'utilisateur. Si c'est le cas, c'est génial. Ma solution est en fait destinée à ne pas autoriser les doublons en: appliquant un index UNIQUE sur l'alias et en regardant d'abord dans la table de ville (par exemple, si vous cherchez "Los Angeles", la table de ville correspondra en premier). Maintenant, si vous êtes autorisé à retourner plus d'un résultat, allez-y avec celui-ci, mais assurez-vous d'avoir un alias pour chaque ville dans la table et gardez cela à l'esprit lorsque vous en ajoutez de nouveaux :) –

+1

Je ne développe pas spécifiquement ceci pour une boîte à suggestions, mais oui, je pense qu'il sera également utilisé dans cette fonctionnalité :) En ce qui concerne les doublons, j'ai pensé à ce que vous avez dit, (en particulier utiliser case1 ici), et j'ai pensé qu'il serait mieux de laisser le l'utilisateur choisit celui qu'il veut. Plus tard, si je dois identifier une ville unique pour un alias donné, je pense que je vais définitivement modifier ma requête en fonction de ce que vous avez dit. – brainydexter

Questions connexes