Каковы основные различия между базами данных? - PullRequest
15 голосов
/ 27 января 2009

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

Например, я использую в основном Oracle и вижу, что другие (MySQL, SQL Server, PostgreSQL, ...) не могут:

То же самое для SQL Server, что другие не могут сделать:

Ответы [ 11 ]

23 голосов
/ 27 января 2009

Oracle CONNECT BY является ограниченной версией рекурсивного SQL стандартного SQL. Рекурсивные «общие табличные выражения» в DB2 и MSSQL немного сложнее в коде, но предлагают больше возможностей, чем Oracle CONNECT BY. (Однако следующая версия базы данных Oracle должна получить рекурсивный SQL.)

Flash back - это действительно уникальная функция Oracle, которая отражает глубину MVCC , встроенную в Oracle. MVCC - это то, как Oracle работает с параллелизмом, в отличие от традиционной пессимистической блокировки; и обработка параллелизма является одним из мест, где существует большая разница между базами данных (хотя большинство СУБД отходят от параллелизма исключительно на основе пессимистической блокировки). На мой взгляд, тот факт, что Oracle опирается на MVCC, является значительным преимуществом.

По ТОП-результатам: У всех СУБД есть способы сделать это.

Кроме этого:

С точки зрения SQL: Oracle имеет наиболее продвинутую и совместимую со стандартами обработку даты и времени. Oracle хорошо работает с функциями, связанными с OLAP (но и с DB2, и с MSSQL; функции OLAP - это область, в которой СУБД с открытым исходным кодом сталкивались с определенными проблемами в обслуживании). В последнее время Oracle, похоже, в основном игнорировал стандарт SQL, поскольку его соответствие стандартам находится в состоянии стагнации (в отличие, например, от MSSQL, который здесь значительно улучшился); Я виню в этом высокомерие из-за большой доли рынка Oracle.

Концептуально: Oracle и MySQL являются примерами двух очень разных способов работы с базами данных. В Oracle создание базы данных занимает целую вечность, а база данных является очень тяжелым объектом, поэтому в мире Oracle база данных обычно содержит множество таблиц, возможно, в разных «схемах». В MySQL база данных является очень легковесным объектом, поэтому MySQL, как правило, имеют много баз данных, в которых сравнительно меньше таблиц (вероятно, поэтому они не жалуются на отсутствие схем в MySQL).

Oracle (как и DB2) является примером СУБД, которая почти включает в себя всю операционную систему: она выполняет множество функций, которые СУБД, такая как MSSQL / MySQL / PostgreSQL, позволяет обрабатывать файловой системе операционной системы и виртуальной памяти. Лично я предпочитаю последний подход, но способ Oracle заставляет Oracle работать практически одинаково независимо от используемой операционной системы.

По сравнению с MSSQL Oracle работает на многих других платформах (как и большинство других СУБД; MSSQL, вероятно, является единственной важной СУБД, которая only работает в Windows).

Oracle предлагает другой способ кластеризации, чем большинство других СУБД: RAC. Я слышал много ужасных историй о RAC, но если вы можете заставить его работать, вероятно, будет справедливо сказать, что у вас есть очень мощное (и дорогое) решение для кластеризации.

Что касается управления, я считаю, что Oracle удивительно сложен в управлении по сравнению с большинством других СУБД.

Тогда, конечно, существуют серьезные ценовые различия: цена Oracle очень высокая и продолжает расти.

4 голосов
3 голосов
/ 27 января 2009

Вот некоторые особенности Sybase SQL Anywhere , которые (AFAIK) не существуют в других продуктах баз данных:

  • шифрование на уровне таблицы
  • сжатие столбцов (доступно в качестве опции в редакции Oracle Enterprise, встроено во все версии SA)
  • хранимые процедуры могут быть написаны на SQL, Java, Perl, PHP, C / C ++, C # или VB.NET

Полное раскрытие: я работаю в Sybase - я являюсь разработчиком в команде сервера SQL Anywhere. Это не означает рекламу или повторное обращение. Если потребуется, я отмечу этот ответ как вики сообщества.

3 голосов
/ 27 января 2009

SQL Server имеет встроенную функцию автоинкремента, которую вы можете добавить в столбец, если вам нужно простое инкрементное число для таблицы.

В Oracle вам нужно создать последовательность и применить соответствующий триггер, чтобы он сам увеличивался.

2 голосов
/ 27 января 2009

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

Я полагаю, что большинство людей, как правило, считают несколько конкретных вещей существенными:

  • производительности
  • Совместимость
  • Портативность
  • расширенные функции
  • простота использования
  • стоимость

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

Мое первое беспокойство заключается в том, что я всегда должен иметь возможность передумать по поводу выбора поставщика базы данных и продукта, поэтому совместимость - это главное, а переносимость - это королева. Имея это в виду, я настоятельно предпочитаю обращаться с базой данных только как с носителем данных, поэтому я избегаю помещать любой код в базу данных и избегать любых функций, которые не относятся к хранилищу или относятся к конкретному поставщику или продукту. Для СУБД совместимость в первую очередь означает соответствие стандарту ANSI SQL, поэтому я немедленно отклоняю любой продукт, который не является достаточно разумным. Поскольку я работаю в мире Linux, Unix и Windows, переносимость означает доступность на всех этих платформах.

Мой код принадлежит вместе и в лучшем для него окружении - не разделен на искалеченную среду движка базы данных; еще один аспект того, что значит рассматривать базу данных как просто носитель данных. Поэтому функции кодирования имеют для меня ограниченное отношение. В очень редких случаях я буду создавать в базе данных код для триггера или некоторых удобных функций, поэтому я ожидаю соответствия стандарту ANSI SQL для основных возможностей, и это все.

У меня обычно много данных, поэтому производительность важна, и я хочу обменяться некоторой простотой использования, чтобы получить ее. Я не возражаю против тяжелой установки базы данных или сложной структуры базы данных, если у меня есть некоторые базовые инструменты для упрощения и автоматизации процесса. Это означает, что я должен быть в состоянии написать сценарий установки механизма базы данных (двоичных файлов), а также структуры и данных моей базы данных. Принудительно использовать GUI, как единственный вариант, для важных задач базы данных недопустимо.

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

Очевидно, что цена покупки ядра базы данных - это стоимость, но и потеря свободы в ее использовании. Поэтому я очень высоко ценю продукты с открытым исходным кодом.

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

Учитывая все это, я предпочитаю ядро ​​базы данных SQLite, потому что его совместимость, переносимость и свобода использования затмевают все остальные.

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

В-третьих, я использую Microsoft SQL Server, когда это требуется моим клиентам. Я поддерживаю мастерство и совместимость с ним, потому что он слишком доминирует на рынке, чтобы его игнорировать. Возможно, у меня даже есть особая функция, которая мне когда-нибудь понадобится, хотя я еще не сталкивался с такой ситуацией.

Я избегаю MySQL из-за его несовместимости, но я часто поддерживаю его как чей-то выбор. Я считал это своим основным предпочтением, но мой глубокий анализ его характеристик показал, что нельзя легко сместить базу кода между ней и любой ANSI-SQL-совместимой СУБД. Для меня это совершенно неприемлемо.

Кстати, моя цель для такого перехода на другой движок базы данных - от нескольких минут до недели (сорок часов). Поскольку я обертываю свой доступ к базе данных слоем совместимости, я обнаружил, что обычно я могу переключать ядра базы данных в течение максимум нескольких часов. Часто мои приложения могут поддерживать несколько механизмов баз данных одновременно (путем простого изменения конфигурации при запуске).

С наилучшими пожеланиями.

2 голосов
/ 27 января 2009

Основное различие между MySQL и почти любой другой базой данных, за исключением SQLite, заключается в том, что MySQL знает только один вид объединения - вложенный цикл.

Это нормально для OLTP, простой рабочей нагрузки, для которой якобы была разработана MySQL (те же принципы разработки привели к тому, что некоторое время не реализовывались такие функции, как триггеры, представления и подзапросы), но это смертельно для основной работы OLAP , Не верьте мне на слово, прочитайте Петра Зайцева: http://peter -zaitsev.livejournal.com / 758.html . Это также ужасно медленно для подзапросов, которые он научился делать совсем недавно. Небольшие шаги, я полагаю ..

Oracle очень продвинут, имеет много функций, и многие из них стоят дополнительных денег. Это медведь, чтобы настроить и поддержать; но если вы можете позволить себе администраторов баз и обслуживания, они работают очень хорошо. Я упоминал стоимость и обслуживание? Просто подумал, что повторю это. Ничего, кроме уважения к инженерам Oracle, однако, они создали некоторые замечательные вещи.

Одним из мест, где Oracle терпит неудачу (как и большинство других), являются многотерабайтные рабочие нагрузки. Для этого вам нужно обратиться к таким специалистам, как Teradata (лучшая в своем классе, очень дорогая), Greenplum, AsterData, Netezza и др.

Я не слышал ничего хорошего о SQL Server, кроме того факта, что он работает только в Windows.

MySQL прост в настройке, быстр для OLTP и обычно использует подход, заключающийся в том, чтобы делать несколько вещей и делать их хорошо.

PostgreSQL является своего рода противоположностью - это любимая игровая площадка исследователя баз данных, что означает, что он имеет дюжину различных стратегий объединения, механизмы хранения, расширенные дополнительные пакеты и все виды вещей. Это медленнее, чем MySQL, когда делаешь дела, MySQL делает хорошо, и уносит его из воды, когда делаешь дела, MySQL просто не знает, как это делать (см. Выше, с хэш-соединениями).

DB2 должна быть хорошей; нет личного опыта. Лучше быть хорошим со всеми этими людьми в Алмадене .. То же самое с Sybase.

1 голос
/ 27 января 2009

Я являюсь разработчиком в команде Sybase SQL Anywhere . Я мог бы публиковать здесь любую информацию о возможностях SQL Anywhere (SA) и тому подобное, если хотите, хотя я не хочу, чтобы меня забывали о размещении рекламы. Не стесняйтесь связаться со мной напрямую, если вам нужна дополнительная информация.

Вот ответы на существующие ответы:

  • SA также поддерживает автоинкремент
  • SA поддерживает || для конкатенации строк
  • SA поддерживает insert ... on existing update для выполнения одного оператора, который может как вставлять новые строки, так и обновлять существующие
1 голос
/ 27 января 2009

И SQL Server, и MySQL не поддерживают стандартную "двойную трубу" для конкатенации строк, в то время как каждая другая БД, похоже, поддерживает это. (Обновление: по-видимому, MySQL ... см. Ниже)

Но это можно исправить ... в коде для MySQL и через http://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=259291 для SQL Server.

1 голос
/ 27 января 2009

MySQL: ЗАМЕНИТЬ . Это «DELETE, затем INSERT», который заменит существующую строку.

0 голосов
/ 15 июля 2009

Я не знаю для другого сервера базы данных, но с PostgreSQL вы можете

INSERT INTO mytable
   ( field_1, field_2,... ) 
VALUES
   ( value_1, value_2 )
RETURNING anyfield

anyfiel d должно быть полем mytable конечно.

Очень интересно, когда anyfield - автоинкремент.

см. PostgreSQL - INSERT

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