Насколько совместимы движки БД на уровне SQL?

Допустим, я хотел иметь приложение, которое могло бы легко переключать БД на сервере. Я в основном думаю о SQL Server как об основной серверной части, но с возможностью перехода на другой движок БД. Firebird и PostGreSQL, кажется, имеют (из моей краткой экскурсии по википедии) наиболее распространенные с SQL Server (плюс они бесплатны).

Насколько похожи будут настройка БД, доступ, запросы и т. д. Для Firebird, PostGreSQL и MS SQL Server?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
264
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

К сожалению, SQL у разных поставщиков сильно различается. Практически невозможно написать все, кроме самого тривиального SQL для работы в ряде СУБД - и тогда вы окажетесь на территории с наименьшим общим знаменателем. Намного лучше использовать уровень абстракции для обработки хотя бы соединения с базой данных (включая доступ, отправку запросов) и либо ORM для обработки самого SQL, либо SQL для каждого поставщика.

Если вы хотите посмотреть, как они различаются - хорошими примерами являются автоматическое увеличение идентификаторов и получение идентификатора последней вставленной записи.

Ответ принят как подходящий

Я работал над одним проектом, где абсолютно необходимо было поддерживать множество баз данных, включая как минимум Access, SQL Server и Oracle.

Так что я знаю, что это можно сделать. В основном DML (SELECT, UPDATE, INSERT ...) - то же самое, и, конечно же, у нас не было серьезных проблем, заставляющих его работать во всех базах данных - просто случайные неприятности. В то время MySQL был исключением, так как он просто не обладал достаточными возможностями.

Мы обнаружили большинство различий в DDL, но с правильной архитектурой (которая у нас была) исправить это несложно.

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

Это действительно упростило задачу, потому что мы избегали использования автоинкремента для полей идентификатора, труднее придумать уникальные ключи - но в конечном итоге лучше.

Что ж, материалы CRUD должны быть одинаковыми везде, но если вы создаете что-то сложное, вы, вероятно, захотите использовать триггеры и хранимые процедуры, и в этом случае совместимость станет низкой. Написание приложения, не зависящего от СУБД, обычно означает перенос большей части бизнес-логики за пределы базы данных, поэтому наличие трехуровневого приложения, IMHO, в таком случае просто необходимо.

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

Как указано в других ответах, СУБД сильно различаются, если вы выйдете за рамки базового материала SELECT / INSERT (а иногда и там).

Мы также должны поддерживать совместимость с несколькими СУБД. На мой взгляд, обычно лучше всего использовать какой-то уровень совместимости. У нас есть собственная библиотека абстракции БД, но доступно несколько инструментов.

В частности, было бы неплохо взглянуть на популярные ORM (Hibernate, nHibernate и т. д.). Обычно они предлагают независимость от БД как своего рода побочный эффект. По крайней мере, в Hibernate есть специальный язык запросов, который автоматически переводится на SQL для СУБД, которую вы используете.

Другие вопросы по теме