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

时间:2011-06-15 00:30:51

标签: mysql ruby-on-rails optimization geolocation latitude-longitude

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

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

来自Google的官方文档:

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

  

具有当前的缩放功能   谷歌地图,你应该只需要6   小数点后的精度数字。   保持所需的存储空间   你的桌子至少可以   指定lat和lng   属性是大小的浮点数(10,6)。   这将让田地存储6   小数点后的数字,加上最多4位   小数点前的数字,例如   -123.456789度。

因此,Google推荐实际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

schema.rb因此看起来像这样:

t.float "lat", :limit => 10
t.float "lng", :limit => 10

缺少小数部分的精度。

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

  • 使用FLOAT(10,6)获得最佳生产效果,并且不要在开发时转储架构(例如rake db:test:load)。
  • 使用Rails支持的DECIMAL(10,6),但需要6个字节,比FLOAT大1.5倍(参见:http://dev.mysql.com/doc/refman/5.1/en/storage-requirements.html)。也许这会是一个很好的折衷方案吗?
  • 使用DOUBLE,这比Google的要求更宽敞,占用8个字节,比FLOAT大2倍。它也很简单。

你的建议是什么?

2 个答案:

答案 0 :(得分:4)

KISS(即提交到框架),它不是很多字节。如果你使用特定的索引,那就更重要了。

答案 1 :(得分:2)

根据您要对数据执行的查询类型,您可能需要查看几何类型:

http://dev.mysql.com/doc/refman/5.1/en/creating-a-spatially-enabled-mysql-database.html

我不熟悉RoR,但这一行特别是:

add_index :places, [ :lat, :lng ]

...似乎表明您计划运行地理空间查询。如果是这样,索引对于所有意图和目的都是无用的,因为btree索引对最近邻点搜索没有帮助。