Мне интересно, какой тип столбца лучше всего хранить широту / долготу в MySQL + Rails.
- Точность должна быть достаточной для хранения каждого бита градусов / широт, полученных с мобильных устройств и / или геокодеров.
- Требования к хранилищу должны быть минимальными для лучшей производительности запросов.
Из официального документа Google:
http://code.google.com/apis/maps/articles/phpsqlajax_v3.html
С текущими возможностями масштабирования
Карты Google, вам нужно только 6
цифры точности после десятичной дроби.
Чтобы сохранить место для хранения, необходимое для
ваш стол как минимум, вы можете
указать, что лат и лнг
Атрибуты являются поплавками размера (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 байтов, в 1,5 раза больше, чем FLOAT
(см .: http://dev.mysql.com/doc/refman/5.1/en/storage-requirements.html). Может быть, это будет хороший компромисс?
- Используйте
DOUBLE
, что намного больше, чем требуется Google, и занимает 8 байтов, в 2 раза больше, чем FLOAT
. Это также просто.
Какая ваша рекомендация?