Какую базу данных выбрать: 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 нарушает явно заданное ограничение, поэтому значение изменено не будет.
Комментарии
Чингачгук
8 сентября, 2017 - 17:34
У постгреса своих приколов хватает, на самом деле, причем там их столько, что мускул на его фоне выигрывает (что мы и видим, в общем-то, по популярности). Не говоря уже о том, что сравнивать эти две СУБД не совсем корректно: MySQL — реляционная, Postgres — постреляционная.
P.S: капча ужасна, такую только роботам и разгадывать
pomodor
8 сентября, 2017 - 18:19
А в чем приколы PostgreSQL? Работал довольно плотно, но ничего раздражающего не заметил. Впрочем, как и в MySQL. Описанное выше лечится установкой глобальной переменной, а в новой версии MySQL такой режим хотят сделать работающим по умолчанию. Что такое "постреляционная" я не знаю, но согласен, что они имеют разное предназначение. MySQL хороша для быстрого извлечения небольших порций текста. Что идеально подходит для небольших и средний сайтов и никто в здравом уме не станет запиливать, например, личный блог с использованием Postgres. А Postgres хорош там, где надо иметь возможность хранить гигабайты данных разного типа и гибко обрабатывать их.
Чингачгук
9 сентября, 2017 - 08:06
Вот же врунишка, у Постгреса нет никаких подводных камней. Все работает так, как и ожидается. Мускуль рядом с Постгресом и рядом не стоял. Про популярность насмешил — Мускуль популярен потому, что его использует тот же Вордпресс, на котором сидят 50% сайтов в сети.
Комментировать