Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
В другой раз мы заметили тормоза и определили, что причиной их стал кластер MongoDB. Но мы так и не смогли разобраться, что именно тормозит в базе. Независимо от того, какие средства для отладки и сбора статистики мы пробовали.
В pg например having не работает для вычисляемых полей
SELECT city, count(*) cnt FROM users GROUP BY city HAVING count(*)>1
SELECT city, count(*) cnt FROM users GROUP BY city HAVING cnt>1
например update в pg работает всегда, даже если там тоже значение
ребята видимо любят использовать то что никогда не пробовали.
Ещё одна фундаментальная проблема, с которой мы столкнулись – это основная особенность MongoDB, а именно, отсутствие схемы. В некоторых случаях это даёт преимущества. Но во многих случаях это приводит к проблеме неявных схем. Они определяются не движком хранения данных, а на основании поведения приложений и прогнозов.

Что вы подразумеваете под термином «данные реального мира»? Объясните пожалуйста подробнее.
Как вы решаете проблему изменения структуры таблиц?
Как вы удаляете связанные данные из базы: за это у вас какой-то код в приложении отвечает?
Например роли юзера (массив ролей), теги поста
Нам нужно иметь возможность изменить цвет, или название тега, как вы это сделаете в монге?
var postSchema = new Schema({
...
tags: [new Schema({
id: {type: Schema.Types.ObjectId, ref: 'Tags'},
name: String
})]
...
});
И давайте возьмем не пост, а допустим баг-трекер.
Они должны быть связаны.Да, но част вырожденный случай — одна «таблица», ни с чем не связанная.
Их структура должна легко изменяться, при необходимости.Не всегда. Особенно если поддержка этой «легкости изменения» влетает в копеечку при каждом, любом запросе.
И это уже больше задача сисадминов, ответственных за прокладку нормального канала связи между хранилищами данных системы, а не проблема СУБД.Нечего сваливать на сисадминов невыполнимые задачи. Что, если в городе всего один интернет-провайдер?
Если у вас только одно приложение работает с базой данных, это не страшно. А если их дюжина, то всё это быстро превращается в кавардак.Это одна из архитектурных ошибок и база тут не причем, видимо поэтому у них и появлялась проблема:
К примеру, задав поле как int(11), вы можете вставить туда текстПо хорошему одно приложение (одна логика, много инстансов) должна работать со «своими» данными и предоставлять апи всем остальным.
К примеру, задав поле как int(11), вы можете вставить туда текст
По хорошему одно приложение (одна логика, много инстансов) должна работать со «своими» данными и предоставлять апи всем остальным.
Оно так и будет, но только когда вы обнаружите эту ошибку. И вот тут жесткая типизация postgresql приходит вам на помощьЯ про то что если «Вася» написал скрипт (свое приложение) который в вашу «1С SQL» начинает делать insert-ы, то жесткая типизация не спасет от кривых данных. Должно быть единое апи через которое все работают.
<?php
$client = new MongoClient;
$collection = $client->selectCollection('bench', 'bench1');
for ($i = 0; $i < $argv[1]; $i++) {
$collection->insert(['data' => 'habrahabr']);
}
<?php
$db = new PDO('mysql:host=localhost;dbname=bench', 'root', '');
for ($i = 0; $i < $argv[1]; $i++) {
$db->query('insert into bench1 (data) values ("habrahabr")');
}
root@e109a01d3001:/# time php mongo.php 1000
real 0m0.176s
user 0m0.055s
sys 0m0.034s
root@e109a01d3001:/# time php mysql.php 1000
real 0m3.961s
user 0m0.075s
sys 0m0.046s
root@e109a01d3001:/# time (for i in {1..100}; do php mongo.php 1000 & done; wait)
real 0m8.242s
user 0m7.763s
sys 0m5.352s
root@e109a01d3001:/# time (for i in {1..100}; do php mysql.php 1000 & done; wait)
real 0m8.937s
user 0m4.027s
sys 0m3.929s
until we replaced the primaries of the cluster
Разговор был, что в sql базах схему надо описывать два раза и вместо того, чтобы решить эту проблему через скажем авто-генерацию вы предлагаете перейти на бд где нет схем.
Прощай, MongoDB, здравствуй, PostgreSQL