Оптимальный тип столбца для широты и долготы на Rails и MySQL - PullRequest
8 голосов
/ 15 июня 2011

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

Какая ваша рекомендация?

Ответы [ 2 ]

4 голосов
/ 15 июня 2011

ПОЦЕЛУЙ (т. Е. Отправляй в фреймворк), это не много байтов. Это будет иметь большее значение, только если вы используете определенные индексы.

2 голосов
/ 15 июня 2011

В зависимости от типа запроса, который вы хотите сделать с вашими данными, вы можете посмотреть на тип геометрии:

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

Я не знаком с RoR,но, в частности, эта строка:

add_index :places, [ :lat, :lng ]

... указывает на то, что вы планируете выполнять геопространственные запросы.Если это так, индекс будет бесполезен для всех намерений и целей, потому что индекс btree не поможет при поиске ближайшего соседа.

...