Совместимость базы данных с SQL - PullRequest
3 голосов
/ 19 августа 2010

Я развертываю приложение Ruby on Rails, которое я разработал с Sqlite3, на сервере с MySQL или PostgreSQL.Я быстро обнаружил, что функции «group by» и «strftime», которые я интенсивно использую для создания сводных отчетов за месяц, работают по-разному или несовместимы между различными базами данных.

Я могу реорганизовать свой код, чтобы выполнить группировку, суммирование и усреднение, но база данных отлично справляется с этой задачей и снижает обработку, требуемую сервером!Расширенные приложения выходят за рамки простого выбора и присоединения.ActiveRecord дает нам: group, но БАЗЫ ДАННЫХ НЕ ПОСТОЯННЫ.

Итак, мой вопрос - вопрос архитектуры: кто-нибудь ожидает создания действительно «переносимых баз данных» приложений в Ruby on Rails?Должен ли я изменить свою кодовую базу для работы только с MySQL и забыть о других базах данных?Должен ли я изменить свою кодовую базу, чтобы выполнить расширенную группировку, суммирование и усреднение?

ура - Дон

Ответы [ 2 ]

4 голосов
/ 19 августа 2010

Несколько комментариев:

  • Разработка и тестирование с той же маркой СУБД и версией , на которую вы собираетесь развернуть.

  • Написание переносимого кода SQL затруднительно, поскольку у поставщиков есть все эти нестандартные дополнительные функции и возможности.Например, strftime() не является частью стандарта ANSI SQL.Единственный способ решить эту проблему - использовать RTM для каждой используемой вами базы данных и узнать, какие у них общие функции.Иногда у них есть функция с другим именем, которую вы можете использовать аналогичным образом.В этом нет кратчайшего пути - вам нужно изучить руководства.

  • Все базы данных поддерживают GROUP BY, но SQLite и MySQL в некоторой степени предпочтительнее определенного использования, чем стандартный ANSI.SQL (и все другие бренды баз данных, которые соответствуют стандарту).В частности, в предложении GROUP BY вы должны назвать каждый столбец в вашем списке выбора, который не является частью функции группировки.

    Правильны следующие два примера:

    SELECT A, B, COUNT(C) FROM MyTable GROUP BY A, B;
    SELECT A, COUNT(C) FROM MyTable GROUP BY A;
    

    Носледующее неверно, потому что B имеет несколько значений на группу, и неоднозначно, какое значение он должен возвращать в данной строке:

    SELECT A, B, COUNT(C) FROM MyTable GROUP BY A;
    
  • Ни один фреймворк не пишет действительно переносимый SQL.ActiveRecord от Rails решает эту проблему только в очень тривиальных случаях.Фактически ActiveRecord помогает решить ни примеров, которые вы приводите, ни функций, специфичных для бренда, и нестандартных предложений GROUP BY.

3 голосов
/ 19 августа 2010

Проблема в том, что особенно с GROUP BY MySQL делает это неправильно. Если вы опускаете столбцы из группы по MySQL, просто возвращает «что-то», считая, что результаты могут быть неопределенными.

Вы можете (должны) использовать параметр ONLY_FULL_GROUP_BY, чтобы MySQL выдавал ошибку, если результат вашего GROUP BY не будет четко определен.

На самом деле, в MySQL нужно изменить гораздо больше настроек, чтобы он вел себя более разумно

Возможно, вам будет интересно прочитать это:

http://www.slideshare.net/ronaldbradford/mysql-idiosyncrasies-that-bite-201007

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...