Советы по написанию SQL для нескольких баз данных - PullRequest
2 голосов
/ 22 августа 2010

Различные базы данных имеют различия в поддержке и реализации SQL.Иногда существует различие в синтаксисе SQL, иногда отсутствует поддержка некоторых команд SQL, иногда в базе данных есть функция, которой нет в других базах данных.

Что считается хорошей практикой при написании запросов SQL, которыеподходит для разных баз данных (MySQL, PostgreSQL, Oracle, MSSQL, SQLite) с учетом того, что разработчик использует среду (например, CakePHP, Codeigniter, Zend и т. д.), которая обеспечивает уровень абстракции базы данных?Какой синтаксис SQL должен стараться избегать разработчик?

Ответы [ 5 ]

9 голосов
/ 22 августа 2010

Затем вы углубитесь в использование ORM и обнаружите, что для сложных запросов - он не работает.Людям достаточно сложно написать SQL, который работает хорошо - я не ожидаю, что уровень абстракции БД будет лучше.Большинство ORM поддерживают собственные хранимые процедуры ... что отрицает цель использования ORM.

ANSI SQL стремится сделать SQL более переносимым среди баз данных, но его применение варьируется от поставщика к поставщику.И синтаксис ANSI не обязательно означает, что он работает так же хорошо, как собственный синтаксис (IE: COALESCE против собственного ISNULL / IFNULL / NVL / и т. Д.)написать собственный код для каждого поставщика.Некоторые будут использовать это как указание на то, почему база данных должна быть не чем иным, как базовым постоянством, потому что легче поддерживать центральное приложение.Но это бледнеет, когда вы имеете дело с приложениями с высокой нагрузкой, которые страдают из-за многочисленных поездок между приложением и базой данных, плохой типизацией данных и дизайном таблиц.Честно говоря, это пустая трата базы данных ...

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

«Осторожно используйте ANSI SQL» - самый прямой ответ на ваш вопрос.

Однако имейте в виду эти слова от Джереми Заводни, особенно:

Хорошие инженеры стараются выбрать лучшие инструменты для работы, а затем делают все возможное, чтобы воспользоваться уникальными и наиболее мощными функциями своего инструмента.В мире баз данных это означает конкретные подсказки, индексацию, типы данных и даже решения по структуре таблиц.Если вы действительно ограничиваете себя набором функций, которые являются общими для всех основных СУБД, вы оказываете себе и своим клиентам огромную медвежью услугу.

То, что люди действительно ищут с ORM, не является- реляционное хранилище данных, которое может быть легко преобразовано в структуры данных языка программирования (например, объекты Ruby).Если вам это нужно, вы можете изучить один из множества вариантов «NoSQL» (MongoDB, CouchDB - два наиболее зрелых варианта).

0 голосов
/ 22 августа 2010

Вы ищете Объектно-реляционное отображение (ORM) .

Объектно-реляционное отображение (ORM, O / RM и O / R mapping) в компьютерном программном обеспечении.является техникой программирования для преобразования данных между несовместимыми системами типов в объектно-ориентированных языках программирования.По сути, это создает «базу данных виртуальных объектов», которую можно использовать из языка программирования.

Вы можете перейти к известной Doctrine .Также взгляните на:

0 голосов
/ 22 августа 2010

Как намекал квантСуп, просто не надо. Если вы посмотрите на каждую из перечисленных платформ, вы заметите, что все они используют ORM или какой-то уровень абстракции базы данных для вставки / извлечения данных. Это позволяет вам писать нейтральный по БД код, который работает независимо от желаемого источника данных. Затем ORM использует правильные «драйверы» источника данных для преобразования ваших намерений в команды, понятные каждому источнику данных.

Итак, хитрость 1.) в определении универсального интерфейса для вашего ORM или уровня абстракции базы данных; а затем 2.) написание соответствующих драйверов для ORM. Затем каждый раз, когда вы хотите использовать новый тип источника данных (включая плоские файлы или CSV), просто добавить новый драйвер.

0 голосов
/ 22 августа 2010

Например, вы можете использовать ORM, который по существу абстрагирует детали от каждой базы данных.Хотя вы должны убедиться, что ваш ORM поддерживает все необходимые базы данных.

Doctrine и Propel являются хорошими друзьями php.Проверьте либо.

Если вы не можете найти ORM, который поддерживает все ваши БД, то, возможно, найдите тот, который покрывает большинство, и расширьте php для обработки последнего.Хотя я сомневаюсь, что это будет так.

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