存储和检索位置字段的最佳方式


Best way to store and retrieve location field

我正在使用PHP和MySQL(带有Laravel框架)。我需要有一个字段位置。我有两个问题:

  1. 如何以优化的方式检索城市和国家/地区列表?
  2. 如何以优化的方式将它们存储在实体的数据库中?

我看到了如下所示的开放式实现:

  • GeoBytes Free AJAX Cities (Hosted API)
  • 免费地理IP城市(自托管)
  • PHP 世界城市阵列(自托管)

如果我使用任何自托管服务,则必须将整个数据集存储到数据库中。这将是巨大的,因为仅CSV的列表约为15 - 20 MB,如果我将其存储在MySQL中,它将不止于此,并且可能是性能问题。

另一方面,如果我使用任何托管 REST API 服务,将其转换为我们的本机格式将是繁琐的工作,并且存在迁移问题,例如:

  1. 我们不能添加新的城市。
  2. 如果服务关闭,则工作繁琐。

对于第二个问题,在数据库中存储位置的最佳方法是什么?以纯文本形式存储会好吗?如果是这种情况,将会有大约 100 条记录包含以下数据:

New York, United States
New York, United States
New York, United States
New York, United States
New York, United States
New York, United States
London, United Kingdom
London, United Kingdom
London, United Kingdom

如何解决这些问题?什么是最佳实践?提前谢谢。

就个人而言,由于您提供的原因,我会将信息加载到 SQL 数据库中,以防止在第三方服务关闭或更改时出现问题。

我会获取CSV文件,对其进行规范化,然后将其导入数据库。

Country (id, name);
Region (id, name, country_id);
City (id, name, region_id);

这样,您就可以为城市选择国家/地区。

SELECT co.name 
FROM City c 
LEFT JOIN Region r 
ON c.region_id = r.id 
LEFT JOIN Country co
ON r.country_id = co.id
WHERE city.name = '$city';