7
votes

Comment modéliser les villes avec des alias dans MySQL

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

La recherche peut être exécutée à l'aide de la ville ou de l'un de ses alias:

pour E.g.

Ville:

  • Nom: Los Angeles
  • alias: LA

    Lorsque vous spécifiez le critère de recherche, je peux spécifier la ou Los Angeles, et il doit renvoyer le même résultat (par exemple hollywood).

    Je pensais à le faire en utilisant une relation à une autre où une ville peut avoir de nombreux alias, et de nombreux alias peuvent mapper dans une ville.

    Lorsque vous faites une recherche, j'utilise une table de la ville et de la villealias pour trouver la bonne ville.

    Y a-t-il un meilleur moyen de traiter cela?

    image

    EDIT: (Pour quiconque rencontre le même problème / les mêmes exigences et arrive à cette page) S'il vous plaît voir ma réponse aussi, car j'ai fini par utiliser cela, mais la réponse marquée vous aide à identifier des villes uniques.


2 commentaires

Je pense que vous êtes à peu près sur la bonne voie, faites bar n'importe quel spectacle SQL que je suis inconnu avec. Je l'aurais fait comme ça que vous suggérez.


Je sais que je viens à cela 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 la suppression d'une ville vs supprimer un alias. Avez-vous géré cela dans le code de l'application? (J'ai un cas similaire)


3 Réponses :


6
votes

La seule chose que je peux ajouter à votre solution est que vous pouvez essayer d'abord à la recherche d'une correspondance exacte dans les tables de la ville et s'il n'y en ait pas, puis rejoignez l'alias One. De cette façon, vous pourriez sauter des jointures assez chères.

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

villes forte> p> xxx pré>

alias strong> P>

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


4 commentaires

Merci pour la perspicacité. Je n'ai pas compris ce que vous vouliez dire là par problème avec des entrées dupliquées . Pouvez-vous élaborer un peu plus sur cela?


J'ai ajouté une explication détaillée sur ces entrées en double. J'espère que cela pourra aider


Merci, cela a aidé. Je discutais avec quelqu'un d'autre, et une autre chose est venue pour résoudre ce que vous avez dit. Au moment de l'ajout d'une ville, créez également un alias dans la table d'alias avec le même nom de ville. De cette manière, une seule nécessité de rechercher dans la table d'alias. En ce qui concerne les entrées en double, je suppose que je donnerai les options à l'utilisateur pour sélectionner lequel utiliser.


Aussi, s'il vous plaît voir ma réponse qui souligne sur les entrées en double.



0
votes

Certaines notes:

Le tableau Destinationalias code> n'a pas besoin d'une clé de substitution. Le (iddestination, alias) code> (ou inverse) peut servir de clé primaire code>. P>

pour éliminer la duplication des noms (communs) dans Les tables et les problèmes pouvant survenir, vous pouvez supprimer la colonne code> nom code> à partir de la table code> de la table code> et ajouter un DestorningDefaullaLias Code> Tableau, ayant un 1: 1 code> relation avec Destinationalias code> (et un 1: 1 code> relation avec destination code>): p>

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


1 commentaires

J'ai combiné votre réponse avec d'autres réponses et propose une solution. Qu'est-ce que tu en penses ?



0
votes

Assomption:

  • La Aguardia est un nom de ville aléatoire Li>
  • la est un alias de La Aguardia Li>
  • Los Angeles est un alias de New York P> LI>

  • Pour chaque ville ajoutée, ajoutez le nom de la ville lui-même comme une entrée à la table d'alias. Nous n'avons donc que de rechercher sur une table d'alias. P> Li> ul>

    Table de ville: P>

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


2 commentaires

Cela sent comme une boîte suggérée :) Vous permettez donc à vous permettre des doublons d'afficher à l'utilisateur. Si tel est le cas, c'est génial. Ma solution est en fait destinée à ne pas autoriser les résultats en double par: Appliquer un index unique sur l'alias et en regardant d'abord la table de la ville (par exemple, si vous recherchez "Los Angeles", la table de la ville correspondra en premier). Maintenant, si vous êtes autorisé à revenir à plus d'un résultat, allez-y avec celui-ci, mais assurez-vous d'avoir un alias pour chaque ville de la table et de supporter cela en ajoutant de nouveaux :)


Je ne développe pas spécifiquement cela pour une boîte de suggestion, mais oui, je pense que cela sera utilisé dans cette fonctionnalité également :) En ce qui concerne les doublons, j'ai pensé à ce que vous avez dit (particulièrement de cas1 ici), et je l'ai pensé " D être mieux pour laisser l'utilisateur choisir lequel il souhaite. Plus tard, si je dois identifier une ville unique pour un alias donné, je pense que je vais certainement modifier ma requête à ce que vous avez dit.