Rails和MySQL上纬度和经度的最佳列类型

ken*_*enn 8 mysql optimization ruby-on-rails geolocation latitude-longitude

我想知道在MySQL + Rails上存储纬度/经度的最佳列类型是什么.

  • 精度必须足以存储从移动设备和/或地理编码器获得的每一位lat/lng度.
  • 存储要求应该是最小的,以获得最佳查询性能.

来自谷歌的官方文件:

http://code.google.com/apis/maps/articles/phpsqlajax_v3.html

使用Google地图的当前缩放功能,您应该只需要小数点后的6位精度.要将表所需的存储空间保持在最小,可以指定lat和lng属性是大小为浮点数(10,6).这将使字段在小数点后存储6位数,加上小数点前最多4位数,例如-123.456789度.

所以,实际上FLOAT(10,6)是谷歌推荐的.

但是,使用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
Run Code Online (Sandbox Code Playgroud)

schema.rb结果将如下所示:

t.float "lat", :limit => 10
t.float "lng", :limit => 10
Run Code Online (Sandbox Code Playgroud)

这缺少了小数部分的精度.

在这里,我可以看到几个选项:

  • 使用FLOAT(10,6)以达到最佳生产性能,不转储模式(如rake db:test:load开发).
  • 使用DECIMAL(10,6),由Rails支持,但它需要6个字节,大于1.5倍FLOAT(参见:http://dev.mysql.com/doc/refman/5.1/en/storage-requirements.html).也许这将是一个很好的妥协?
  • 使用DOUBLE,比Google的要求更宽敞,占用8个字节,比2倍大FLOAT.它也很简单.

你的建议是什么?

rag*_*ggi 4

KISS(即提交到框架),它不是很多字节。如果您使用特定索引,它只会更重要。