172 похожих чатов

Привет, подкиньте идей пожалуйста ) Делаю в базе представление данных, которое

по сути является набором графов. Для упрощение запросов на чтение в таблице на каждый граф одна строчка и поле array с набором вершин. Все работает, но добавлять данные в такую структуру очень медленно. При каждом обновлении вершин нужно смотреть, что новая связь не образовала связей между существующими графами — тогда их нужно объединить в один, а старые удалить. При объединение нужно удалять повторы вершин еще )
Пока из вариантов вижу делать отдельно нормализованное представление данных в виде m2m, грузить туда, а после загрузки данных запускать синхронизацию и перегонять это в денормализованный вид с полем array.
Может еще варианты какие-то есть?) Может postgres вообще лучше тут не использовать? :D

5 ответов

13 просмотров

если очень надо сделайте 2 уровня: уровень хранения (куда выбдете сохранять и где информация будет храниться) и уровень представления (тот слой с которым вы будете работать, так как вам удобно)...

графы обычно хранят в виде adjacency list. я бы предложил две таблицы. первая — с данными: graph ::: gra_id, <ANY DATA> вторая — со связями: graph_links ::: gra_id, gra_link если б было дерево (частный случай графа, у каждой вершины — только один родитель), можно бы было ограничиться одной таблицей. потребуется некоторая "обвязка" (рекурсивными) функциями, чтобы выборки делались в виде: SELECT * FROM graph_children_of(5) INNER JOIN graph USING(gra_id) SELECT * FROM graph_path_of(5) INNER JOIN graph USING(gra_id) все запросы будут проходить только по PK, т.е. всё будет очень быстро работать.

Валентин- Автор вопроса
Maxx
графы обычно хранят в виде adjacency list. я бы пр...

Разве в таком случае не будет довольно медленное чтение? У нас линков будут десятки/сотни миллионов. Чтобы раскрутить все транзитивно связанные узлы понадобится много рекурсивных запросов по такой схеме.

Валентин
Разве в таком случае не будет довольно медленное ч...

хм, да, за циклами в связях надо будет следить. я привык только с деревьями, упустил этот момент =)

Похожие вопросы

Обсуждают сегодня

$params = [ 'formid' => 'feedbackForm', 'formTpl' => '@CODE: <form class="form-validate" data-id="ajax_form"> <fieldset class="margin-bottom-md"> ...
Pathologic
1
И ещё вопрос: можно ли типа как на дос как-то запариться и с помощью прерываний выводить текст, вместо функции printf ?
НѣкъиⰘижєжєиꙁъвьсєсвѣтьноѣсѣтиѥсть•
34
окей, дело реально в org было. но что за мусор в конце?
Vi Chapmann
15
Ладно, ещё тупого спрошу. Код должен банально вывести значение регистра на консоль, на деле же не выводя ничего, просто оставляя нерабочую консоль (открыта, ничего не написан...
НѣкъиⰘижєжєиꙁъвьсєсвѣтьноѣсѣтиѥсть•
25
Есть тут крутые SQL-маньяки (в частности postgresql)? Нужна помощь, совет, что-то всю голову сломал, не могу придумать как реализовать нужное. Есть вот такой набор данных: f...
Alex
11
здравствуйте. пытаюсь проверить, содержится ли в десятичном представлении инта некоторая цифра. совершаю: strstr(x, "5") != NULL) получаю ошибку с фото (заведомо неработающий ...
Катя Шевчук🪇
18
Что там вообще с кроссплатформенностью?
🄼🄰🄺🅉🄰🄸
23
Ребят, а вот такой вопрос: если я владелец бота анонимного чата, в котором, например, имеются подписки, используя какую-нибудь ЮКассу (или тому подобное, в общем с налогами, в...
Eugene Неелов
8
Доброй ночи. Вопрос знатокам. Имеется некая таблица, результат которой выведен в DBGrid на форме. И есть форма, с помощью которой можно как добавить запись, так и отредактиров...
Евгений
28
а всё почему? потому что ассемблер в отличии от яву порождает множество пагубных привычек, среди которых например можно отметить использование глобальных переменных для всего ...
Mixail Frolov
35
Карта сайта