存储和检索位置字段的最佳方式
Best way to store and retrieve location field
我正在使用 PHP 和 MySQL(使用 Laravel 框架)。我需要有一个现场位置。我有两个问题:
- 如何以优化的方式检索城市和国家列表?
- 如何以优化的方式将它们存储在实体的数据库中?
我见过像下面这样的开放式实现:
- GeoBytes Free AJAX Cities(主持API)
- Free GeoIP Cities(自托管)
- PHP World Cities Array(自托管)
如果我使用任何自托管服务,我必须将整组数据存储到数据库中。这将是巨大的,因为仅 CSV 列表大约有 15 - 20 MB,如果我将它存储在 MySQL 中,它会超出这个范围,这可能是一个性能问题。
另一方面,如果我使用任何托管 REST API 服务,将其转换为我们的本机格式将是一项繁琐的工作,并且存在迁移问题,例如:
- 我们无法添加新城市。
- 如果服务中断,工作会很乏味。
关于第二个问题,将位置存储在数据库中的最佳方式是什么?以纯文本形式存储它会好吗?如果是这样的话,将会有大约 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 数据库中,以防止在第 3 方服务关闭或更改时出现问题。
我会获取 CSV 文件,对其进行规范化,然后将其导入数据库。
Country (id, name);
Region (id, name, country_id);
City (id, name, region_id);
这样你就可以select城市的国家。
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';
我正在使用 PHP 和 MySQL(使用 Laravel 框架)。我需要有一个现场位置。我有两个问题:
- 如何以优化的方式检索城市和国家列表?
- 如何以优化的方式将它们存储在实体的数据库中?
我见过像下面这样的开放式实现:
- GeoBytes Free AJAX Cities(主持API)
- Free GeoIP Cities(自托管)
- PHP World Cities Array(自托管)
如果我使用任何自托管服务,我必须将整组数据存储到数据库中。这将是巨大的,因为仅 CSV 列表大约有 15 - 20 MB,如果我将它存储在 MySQL 中,它会超出这个范围,这可能是一个性能问题。
另一方面,如果我使用任何托管 REST API 服务,将其转换为我们的本机格式将是一项繁琐的工作,并且存在迁移问题,例如:
- 我们无法添加新城市。
- 如果服务中断,工作会很乏味。
关于第二个问题,将位置存储在数据库中的最佳方式是什么?以纯文本形式存储它会好吗?如果是这样的话,将会有大约 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 数据库中,以防止在第 3 方服务关闭或更改时出现问题。
我会获取 CSV 文件,对其进行规范化,然后将其导入数据库。
Country (id, name);
Region (id, name, country_id);
City (id, name, region_id);
这样你就可以select城市的国家。
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';