Rails和MySQL上经度和纬度的最佳列类型
||
我想知道在MySQL + Rails上存储纬度/经度的最佳列类型是什么。
精度必须足以存储从移动设备和/或地理编码器获得的所有经度/纬度度。
为了达到最佳查询性能,存储需求应该最小。
摘自Google的官方文件:
http://code.google.com/apis/maps/articles/phpsqlajax_v3.html
使用当前的缩放功能
Google Maps,您只需要6
小数点后的精度位数。
保留所需的存储空间
您的桌子最少,您可以
指定lat和lng
属性是大小为(10,6)的浮点数。
那将使字段存储6
小数点后的数字,最多4
小数点前的数字,例如
-123.456789度。
因此,实际上Google推荐了“ 0”。
但是,对于Rails 3,似乎没有简单的方法来精确定义小数点后的“ 1”列类型。例如,您可以使用原始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 个回复
倪蕊悲潍
结乳
...似乎表明您正在计划运行地理空间查询。如果是这样,则该索引对所有意图和目的都将是无用的,因为btree索引对最近邻点搜索没有帮助。