Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Serials contrast with episodic television, with plots relying on a more independent stand-alone format. Procedural drama television programs are commonly episodic
Though some American television shows have introduced serial elements into their narratives, episodically numbered serials are rare in modern US television. They are generally used within episodic series to generate ratings spikes, and are usually limited to two parts.
create table foo (id serial primary key, data jsonb);
И получить ту же монгу?Это не так удобно как монга, + тут есть сложности обновления данных, например инкремент json поля или операция find&modify, upsert. Это так же отрицательно сказывается на скорость.

MongoDB 2.8 includes support for two storage engines: MMAPv1, the storage engine available in previous versions of MongoDB, and WiredTiger. By default, in 2.8 MongoDB uses the MMAPv1 engine.
WiredTiger supports all MongoDB features and can interoperate with MMAPv1 in the same replica set or sharded cluster, but requires a change to the on-disk storage format.
Вы это читали?
А про совместимость обоих движков?
старое просто не переведетеВ том же абзаце описано два очень простых способа сделать это.
{"name": "The Newsroom", "_id": 1}
{"name": "Jeff Daniels", "_id": 1, "shows": [1, 2, 3]}
В общем основная идея в том, что в MongoDB ответственность за удаление связанных данных действительно ложится на приложение
Советы в духе «не можете удалить сериал — не удаляйте» тоже, конечно, радуют. Реальный кейс возможности удалить данные — это любая админка же.Вы изменил форму и суть моего посыла. Суть была в том, что на больших проектах даже в реляционных базах стараются избежать удаления сильно связанных данных. Почему это так, я описал в статье.
А можно пример сервисаПочти любые веб сайты удобно делать с монгой.
в каких юзкейсах отсутствие схемы дает больше плюшекНет проблем миграции данных, более гибкая структура данных дает разные преимущества, за счет разных факторов скорость разработки вырастает.
Реальный кейс возможности удалить данные — это любая админка же.Проблемы удаления нет, целостность поддерживается с помощью 2-х фазных коммитов.
Нет проблем миграции данных
По своему опыту могу сказать, что графовые базы, несмотря на их название, отлично работают с графами (в том числе, с социальными графами). Конечно, не стоит брать графовые базы в качестве основного хранилища данных.
А если нам надо найти пользователя по имени, то здесь графовая база будет уже мягко говоря не эффективна.Создаётся текстовый индекс по имени. Какие проблемы?
Нет никакой эмуляции графов, потому что графов нет.
я считаю, что фотографии — в альбомах — данного человека — это граф
Привел я их исключительно чтобы вы понимали, что прогресс РСУБД не остановился во времена когда Кодд придумал реляционную алгебру.
Я не вижу объективных оснований применять знания теории графов и алгоритмы на графах в текущей задаче.
И не забывайте, что мы говорим о конкретной задаче — фотографии в альбоме.
<spoiler title="Заголовок">Содержимое</spoiler>
Вставка спойлера (разворачиваемый блок информации).
Вставка спойлера (разворачиваемый блок информации).
Поставить по инструкции не сложно. Настраивать не нужно. Лишних хитростей нет. Простому сайту — простая база. Ведь замечательно!
Кстати, если прочитав про Фейсбук вы вскрикнете «ага, в MySQL же персистентность» — лучше Вам мое лицо не видеть.
Понятное дело, что в первую очередь они хотят видеть 400 фоток очередной свадьбы каждого ближайшего родственника в обратной пропорциональности к степени убывания родства, а во вторую — прямопропорционально «весу» родственника в обществе.
select top 400 ...
from photos p
join tagphoto tp on p.objectid = tp.objectid
join tags t on tp.tagid = t.id
join relations r on p.owner = r.target
join users u on u.id = r.target
where r.source = @userid
and t.name='свадьба'
and r.depth < 6
order by r.depth, p.date, u.score
SELECT expand( tag['свадьба'].out( "photo" ) )
FROM (
SELECT
FROM (
TRAVERSE both( "friend" )
FROM (
SELECT
FROM Person
WHERE id = '123'
)
WHILE $depth < 6
)
ORDER BY $depth ASC , score DESC
)
LIMIT 400
SELECT expand( tag['свадьба'].out( "photo" ) )
FROM (
SELECT
FROM (
TRAVERSE both( "friend" )
FROM (
SELECT
FROM Person
WHERE id = '123'
)
WHILE $depth < 6
STRATEGY BREADTH_FIRST
)
ORDER BY $depth ASC , score DESC
)
LIMIT 400
TRAVERSE wedding_album.out_photos FROM (
SELECT FROM (
TRAVERSE both(has_relative) FROM @userRID STRATEGY BREADTH_FIRST
) ORDER BY $score DESC, $depth ASC
)
LIMIT 400
Запросы типа покажи мне все фото детей дочерей брата бабушки по маме — достаточно частые и формироваться могут произвольно
Поэтому если графи сохраняется на диске, то для него также нужен будет индекс, причем в виде B+-дерева.Почему? Ведь B+-дерево мы храним на диске, не используя никакие дополнительные средства, почему для произвольного графа без них будет не обойтись?
в графовой базе практически не нужно заводить отдельные индексы, потому, что графовая база — сама по себе уже индекс
А если мы начинаем везде использовать индексыНо мы не используем здесь индекс (структуру данных, по которой можем быстро искать) для нашего графа, а просто заимствуем ваш прием и храним нужные данные прямо в списке ребер. Для данной задачи (вывести все вершины, соединенные с заданной) нам индекс не нужен, достаточно любой структуры, которая может выдать все хранящиеся в ней элементы.
Ага, а права доступа кто проверять будет?Это не зависит от способа хранения, предлагаю не примешивать в обсуждение нерелевантные вещи.
Хранить данные в индексе — это очень идеальный случай, оторванный от жизниНа парктие это как раз единственный жизнеспособный сценарий. Все нетривиальные (не по ключу) выборки должны иметь покрывающие индексы. И я очень редко видел когда этого нельзя добиться. В памяти индексу влезать не обязательно, он использует те же b-деревья и очень быстро читается с диска даже для очень большого количества строк.
Но все равно остается необходимость поиска данных по ключу, поэтому сами данные будут хранится примерно также — в древообразной структуре. Но это означает, что периодически надо будет структуру дерева менять (page split для B+, балансирование для AVL и RB-tree итп), это значит что физическое смещение записи в файле данных будет меняться.Почему? Будем в индексе поиска по ключу хранить не сами данные, а ссылки на их физическое расположение, тогда ребалансировка не будет изменять расположение данных.
Когда структура поменяется надо будет найти в индексе записи, ссылающиеся на старые адреса и обновить их. А как найти такие адреса? Только обходом всего индекса.Ну не всего, если у нас граф, скажем, неориентированный, то мы знаем с какими вершинами наша связана, ровно для них и надо менять. Но, вообще, надо стремиться, чтобы данные своё физического расположения не меняли.
Будем в индексе поиска по ключу хранить не сами данные, а ссылки на их физическое расположение, тогда ребалансировка не будет изменять расположение данных.
Ну не всего, если у нас граф, скажем, неориентированный, то мы знаем с какими вершинами наша связана, ровно для них и надо менять.
Но, вообще, надо стремиться, чтобы данные своё физического расположения не меняли.
Нет, никакой схемы там нет.
Насчет текстового поля и ссылку не понял, что за ссылки вы имеет в виду.
Почему вы никогда не должны говорить «никогда»