Оптимальный тип столбца для широты и долготы в Rails и MySQL

Мне интересно, какой тип столбца лучше всего подходит для хранения широты / долготы в 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 . Это тоже просто.

Что вы порекомендуете?

8
задан kenn 15 June 2011 в 00:30
поделиться