Какую базу данных выбрать: MySQL vs PostgreSQL

Отличный вопрос для холивара. Но не будем. Опубликована статья Why favor PostgreSQL over MariaDB / MySQL, автор которой рассматривает обе СУБД с позиции бережного отношения к данным и приходит к выводу, что для серьезных проектов подходит PostgreSQL, а MySQL — вообще не вариант.

Пример превосходства PosgreSQL над MySQL

Например, создадим таблицу и для одного из полей зададим тип numeric(4, 2) — четыре разряда под хранение всего числа и два разряда после запятой. А потом попытаемся вставить число, которое не соответствует описанию. И что вы думаете? Нет проблем!


CREATE TABLE data (
id integer NOT NULL,
data numeric(4, 2)
);

INSERT INTO data VALUES (1, 1234.5678);
Query OK, 1 row affected, 1 warning (0.01 sec)

SELECT * FROM data;
+—-+——-+
| id | data |
+—-+——-+
| 1 | 99.99 |
+—-+——-+

1 row in set (0.00 sec)

В ручном режиме мы увидим (возможно) предупреждение (1 warning) попытаемся догадаться, о чем оно и восстановить прежнее значение. Но предупреждение легко пропустить. Если вы пишете приложение, имеющее дело с хранением финансовых данных, такие ошибки будут стоить очень дорого.

PostgreSQL бережет ваши данные и ведет себя более серьезно:


INSERT INTO data VALUES (1, 1234.5678);
ERROR: numeric field overflow
DETAIL: A field with precision 4, scale 2 must round to an absolute value less than 10^2.

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

А теперь немного мистики. Помните, мы описали, что поле id для MySQL не должно быть NULL? Пробуем:


UPDATE data SET id = NULL WHERE id = 1;
Query OK, 1 row affected, 1 warning (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 1

SELECT * FROM data;
+—-+——+
| id | data |
+—-+——+
| 0 | 99.99 |
+—-+——+

1 row in set (0.00 sec)

Удивительно, но несмотря на явный запрет (NOT NULL), СУБД MySQL разрешила-таки обновить поле, причем установила его значение в 0, хотя о нуле мы вообще ничего не говорили. 0 и NULL — совершенно разные сущности. 0 — это число. NULL — это особый индикатор, говорящий нам о том, что мы не знаем, какое число содержится в этом поле. И совсем необязательно это 0. Таким образом, СУБД опять приписала от себя случайное значение в нашу базу. Если в вашем приложении будет такая же ошибка, то MySQL поможет этой ошибке долго оставаться необнаруженной. А что же PostgreSQL? Тут всё чётко:


UPDATE data SET id = NULL WHERE id = 1;
ERROR: null value in column „id“ violates not-null constraint

NULL в столбце id нарушает явно заданное ограничение, поэтому значение изменено не будет.

Остальные примеры можно найти в оригинальной статье.
field_vote: 
Ваша оценка: Нет Средняя: 3.9 (13 оценки)
Главная тема: 
Названия программ: 
Программное обеспечение: 

Комментарии

У постгреса своих приколов хватает, на самом деле, причем там их столько, что мускул на его фоне выигрывает (что мы и видим, в общем-то, по популярности). Не говоря уже о том, что сравнивать эти две СУБД не совсем корректно: MySQL — реляционная, Postgres — постреляционная.
P.S: капча ужасна, такую только роботам и разгадывать

Оценка: 
Средняя: 5 (2 оценки)

А в чем приколы PostgreSQL? Работал довольно плотно, но ничего раздражающего не заметил. Впрочем, как и в MySQL. Описанное выше лечится установкой глобальной переменной, а в новой версии MySQL такой режим хотят сделать работающим по умолчанию. Что такое "постреляционная" я не знаю, но согласен, что они имеют разное предназначение. MySQL хороша для быстрого извлечения небольших порций текста. Что идеально подходит для небольших и средний сайтов и никто в здравом уме не станет запиливать, например, личный блог с использованием Postgres. А Postgres хорош там, где надо иметь возможность хранить гигабайты данных разного типа и гибко обрабатывать их.

Оценка: 
Средняя: 5 (1 оценка)

Вот же врунишка, у Постгреса нет никаких подводных камней. Все работает так, как и ожидается. Мускуль рядом с Постгресом и рядом не стоял. Про популярность насмешил — Мускуль популярен потому, что его использует тот же Вордпресс, на котором сидят 50% сайтов в сети.

Оценка: 
Средняя: 3 (2 оценки)

Комментировать

Filtered HTML

  • Use [fn]...[/fn] (or <fn>...</fn>) to insert automatically numbered footnotes.
  • Доступны HTML теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <blockquote> <strike> <code> <h2> <h3> <h4> <h5> <del> <img>
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.