繁体   English   中英

如何在MySQL中使用别名对城市进行建模

[英]How to model cities with aliases in MySQL

给定位置(城市)可以具有名称以及可以通知的其他别名。 我需要在数据库中对此进行建模。

可以使用城市或其任何别名执行搜索:

例如

市:

  • 名字:洛杉矶
  • 别名:洛杉矶

指定搜索条件时,我可以指定洛杉矶或洛杉矶,它应该返回相同的结果(例如好莱坞)。

我正在考虑使用一对多关系来做这件事,其中一个城市可以有很多别名,而且许多别名可以映射到一个城市。

在进行搜索时,我使用city和cityAlias表的连接来查找正确的城市。

有没有更好的方法来处理这个?

图片

编辑:(对于遇到相同问题/要求并碰巧来到此页面的人)请参阅我的答案,因为我最终使用了它,但标记的答案可以帮助您识别独特的城市。

我可以添加到您的解决方案中的唯一方法是,您可以先尝试在城市表中查找完全匹配,如果没有,则加入别名。 这样你就可以跳过一些非常昂贵的连接。

另一件需要注意的事情是,这种双表解决方案可能会遇到重复条目的问题。 我不是在谈论不同城市的相同别名(可以使用唯一列进行检查),但是匹配城市名称的别名。 这些“重复条目”的示例后面是详细说明:

城市

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

别名

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

我知道这不应该发生......但是你知道摩尔定律:)这些跨表复制可能会给你一个查找表中的麻烦(我想你正在使用它们作为一个“猜测”城市实际上是什么试图在他/她写“LA”时选择用户。 但是如果用户写了“洛杉矶”,你将不得不决定是否优先考虑城市或别名。 我知道我提供的例子有点傻但作为一个非美国公民,我无法提供更好的例子。 但是那里有很多城市,每个都有很多别名...我不会冒险:)

首先检查城市表将使城市优先于其他城市的等同命名别名。 或者,您可以在插入之前检查城市的别名是否已作为城市名称出现。

这就是我能想到的全部:)

一些说明:

DestinationAlias表不需要代理键。 (idDestination, alias) (或反向)可以作为PRIMARY KEY

要消除两个表中的(公共)名称的重复以及可能发生的问题,可以从Destination表中删除name列,并添加DestinationDefaultAlias表,与DestinationAlias具有1:1关系(以及隐含的1:1Destination关系):

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

当你要查找的默认名称,您加入DestinationDestinationDefaultAlias 要搜索所有别名,请加入DestinationAlias

假设:

  • La 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:

搜索洛杉矶 :yield(cityID)=> [1,3] =唯一> [洛杉矶,La Aguardia]

用例2:

搜索洛杉矶 :yield(cityID)=> [1,2] =唯一> [洛杉矶,纽约]

用例3:

搜索纽约 :yield(cityID)=> [2,2] =唯一> [纽约]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM