我想知道在MySQL + Rails上存储纬度/经度的最佳列类型是什么。
来自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
)。DECIMAL(10,6)
,但需要6个字节,比FLOAT
大1.5倍(参见:http://dev.mysql.com/doc/refman/5.1/en/storage-requirements.html)。也许这会是一个很好的折衷方案吗?DOUBLE
,这比Google的要求更宽敞,占用8个字节,比FLOAT
大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索引对最近邻点搜索没有帮助。