【发布时间】:2011-09-15 03:43:46
【问题描述】:
我想知道在 MySQL + Rails 上存储纬度/经度的最佳列类型是什么。
- 精度必须足以存储从移动设备和/或地理编码器获得的纬度/经度的每一位。
- 为了获得最佳查询性能,存储要求应该最低。
来自谷歌官方文档:
http://code.google.com/apis/maps/articles/phpsqlajax_v3.html
使用当前的缩放功能 谷歌地图,你应该只需要 6 小数点后的精度位数。 为了保持所需的存储空间 至少你的桌子,你可以 指定 lat 和 lng 属性是大小为 (10,6) 的浮点数。 这将使字段存储 6 小数点后的位数,最多加 4 小数点前的数字,例如 -123.456789 度。
所以,实际上FLOAT(10,6) 是 Google 推荐的。
但是,在 Rails 3 中,似乎没有简单的方法可以在小数点后精确定义 FLOAT 列类型。例如,您可以使用原始 SQL 编写迁移,如下所示:
def self.up
execute <<-SQL
ALTER TABLE places
ADD `lat` FLOAT(10,6),
ADD `lng` FLOAT(10,6)
SQL
add_index :places, [ :lat, :lng ]
end
但schema.rb 将如下所示:
t.float "lat", :limit => 10
t.float "lng", :limit => 10
缺少小数部分的精度。
在这里我可以看到几个选项:
- 使用
FLOAT(10,6)以获得最佳生产性能,并且不要在开发时转储架构(例如rake db:test:load)。 - 使用
DECIMAL(10,6),Rails 支持,但需要6 个字节,是FLOAT的1.5 倍(参见:http://dev.mysql.com/doc/refman/5.1/en/storage-requirements.html)。也许这是一个很好的妥协? - 使用
DOUBLE,比谷歌要求的空间大很多,占用8个字节,是FLOAT的2倍。也很简单。
你有什么建议?
【问题讨论】:
标签: mysql ruby-on-rails optimization geolocation latitude-longitude