Как реализовать постоянство сложного графа с объектной базой данных? - PullRequest
3 голосов
/ 02 декабря 2011

У меня есть несколько графиков.Ширина и глубина каждого графика могут варьироваться и будут подвергаться изменениям и изменениям во время выполнения.См. Пример графика.

enter image description here

Существует корневой узел для захвата всего графа (т. Е. Дерева).Узел может иметь несколько дочерних элементов, и каждый дочерний объект выполняет специальную функцию.Кроме того, узел может получить доступ ко всем своим прямым дочерним элементам, чтобы получить определенную информацию.С другой стороны, дочерний узел может не знать ни своего родительского узла, ни других братьев и сестер.Пока ничего впечатляющего.

Сохранение каждого графика и обновление его с помощью объектной базы данных (в данном случае DB4O) выглядит довольно просто.Я мог бы использовать реляционную базу данных для обеспечения сохранности данных (включая триггеры базы данных и т. Д.), Но вместо этого я хотел реализовать ее с помощью объектной базы данных.

В моих графиках есть одна особенность.См. Другой пример графика.

enter image description here

Для правильного выполнения вычислений некоторые узлы требуют информации от других узлов.Эти другие узлы могут быть братьями и сестрами, детьми / внуками или связаны в каком-либо другом виде.В этом случае конкретный узел знает и другие соответствующие узлы (и, таким образом, может получать необходимую информацию непосредственно от них).Ради простоты первое изображение не показывало все потенциальные связи.

Если один узел имеет изменение состояния (например, вызванное внутренним таймером или запущенное каким-либо другим узлом), он сообщит другим узлам (заинтересованным наблюдателям, см. Также образец наблюдателя ) оменять.Каждый информированный узел затем предпримет соответствующие действия для обновления своего собственного состояния (и, в свою очередь, при необходимости проинформирует других наблюдателей).Корневой узел не будет знать о каждом происходящем изменении, поскольку только вовлеченные узлы будут знать, что что-то изменилось.Если такая цепочка событий запускается корневым узлом, то, конечно, это не является большой проблемой.

Цель состоит в том, чтобы обеспечить постоянство данных в объектной базе данных.Данные в памяти должны синхронизироваться с данными, хранящимися в базе данных.Что добавляет сложности, так это тот факт, что графы не состоят из простых (и глупых) узлов данных, но в каждом узле интегрировано множество функций (т. Е. События, которые вызывают изменения состояния по всему графу).

У меня есть несколько грубых идей о том, как справиться с представленной проблемой (например, (1) более сильное разделение данных и функциональности или (2) более сильная интеграция базы данных или (3) установить произвольный интервал времени для обновления данных и принять этоданные могут быть не синхронизированы в течение определенного периода времени).Мне нужны дополнительные входные данные и варианты, касающиеся такой ключевой проблемы (которая определенно оставит значительные следы в конкретной реализации).

(отредактировано) Есть еще один аспект, который я забыл упомянуть.График не должен постоянно находиться в памяти.Графы, которые не нужны, будут присутствовать только в базе данных и, таким образом, будут переведены в состояние приостановки.Это еще одна проблема, требующая рассмотрения.В то время как в режиме ожидания механизмы обновления, вероятно, будут также переведены в режим сна, и это не предназначено.

Ответы [ 2 ]

1 голос
/ 05 декабря 2011

Какой точный вопрос?Вот несколько комментариев:

Как уже упоминалось @German: Для сложных графов объектов вы, вероятно, захотите использовать прозрачное постоянство .

Также как упоминание @German: Обратный вызов может помочь вам выполнить дополнительные действия при чтении / записи объектов и т. Д. В базе данных.

В шаблон наблюдателя.Вы на .NET или Java?Обычно вы не хотите хранить наблюдателей в базе данных, так как наблюдатели обычно являются частью вашей бизнес-логики, графического интерфейса и т. Д. В .NET события автоматически не сохраняются.В Java убедитесь, что вы пометили поле, содержащее ссылки на наблюдателя, как временные.

В случае, если вы действительно хотите сохранить наблюдателей, например, потому что они являются просто другими элементами в вашем графе объектов.В .NET вы не можете хранить делегаты / закрытия.Поэтому вам необходимо ввести интерфейс для вызова наблюдателя.На Java: часто мы используем анонимные внутренние классы в качестве слушателя: хотя db4o может хранить их, я бы НЕ рекомендовал этого.Потому что анонимный внутренний класс получает сгенерированное имя, которое может измениться.Тогда db4o не найдет этот класс позже, если вы изменили свой код.

Вот и все.Задайте более подробные вопросы, если хотите узнать больше.

1 голос
/ 05 декабря 2011

В случае db4o отметьте «прозрачную активацию», чтобы автоматически загружать объекты по требованию, когда вы пересекаете график (таким образом, граф не должен быть полностью в памяти), и проверяйте «прозрачное сохранение», чтобы разрешить каждому узел сохранится после изменения состояния.

http://www.gamlor.info/wordpress/2009/12/db4o-transparent-persistence/

Кроме того, вы можете использовать "обратные вызовы" db4o для запуска пользовательского поведения во время операций db4o.

НТН

Немецкий

...