Альтернатива иерархической модели данных

Проблемный домен

Я работаю над довольно большим приложением, в котором используется иерархическая модель данных. Он берет изображения, извлекает особенности изображений и создает объекты анализа поверх них. Таким образом, базовая модель похожа на Object-(1:N)-Image_features-(1:1)-Image. Но один и тот же набор изображений можно использовать для создания нескольких объектов анализа (с разными параметрами).

Тогда объект и изображение могут иметь множество других связанных объектов, например, объект анализа может уточняться дополнительными данными или сложные выводы (решения) могут быть основаны на объекте анализа и других данных.

Текущее решение

Это набросок решения. Стеки представляют собой наборы объектов, стрелки представляют собой указатели (т. е. элементы изображения ссылаются на свои изображения, но не наоборот). Некоторые части: изображения, особенности изображения, дополнительные данные могут быть включены в несколько объектов анализа (поскольку пользователь хочет провести анализ на разных наборах объектов, объединенных по-разному).

Упрощенный эскиз текущего решения

Изображения, признаки, дополнительные данные и объекты анализа хранятся в глобальном хранилище (бог-объект). Решения хранятся внутри объектов анализа посредством композиции (и, в свою очередь, содержат признаки решения).

Все объекты (изображения, признаки изображения, объекты анализа, решения, дополнительные данные) являются экземплярами соответствующих классов (например, IImage, ...). Почти все части являются необязательными (например, мы можем отказаться от изображений после того, как у нас будет решение).

Недостатки текущего решения

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

Моя идея

Я хотел бы построить более расширяемую (2) и гибкую (1) модель данных. Первая идея заключалась в использовании реляционной модели, разделяющей объекты и их отношения. И почему бы не использовать здесь СУБД - sqlite кажется мне подходящим движком. Таким образом, сложные отношения будут доступны с помощью простых (левых) JOIN в базе данных: псевдокод «images JOIN images_to_image_features JOIN image_features JOIN image_features_to_objects JOIN objects JOIN solutions JOIN solution_features»), а затем извлечения фактических объектов C++ для функций решения из глобального хранилища по идентификатору.

Вопрос

Итак, мой основной вопрос

  • Является ли использование СУБД подходящим решением для описанных мною проблем, или оно того не стоит, и есть лучшие способы организации информации в моем приложении?

Если RDBMS в порядке, я был бы признателен за любые советы по использованию RDBMS и реляционного подхода для хранения отношений объектов C++.


person Steed    schedule 20.08.2012    source источник
comment
Привет Стид. То, что вы задаете, действительно сложный вопрос. Вы тоже задаете много вопросов, а не один. Что вы называете моделью данных? Вы собираетесь использовать модель данных по сети, записывать ее в файл в памяти? Без подробностей и конкретного вопроса ответы становятся еще сложнее   -  person Dirk    schedule 20.08.2012
comment
Я открываю файл, создаю структуру данных, работаю с ней, сохраняю обратно в файл. Под моделью данных я подразумеваю хранение информации об объектах реального мира и связях между ними в памяти. Я попробую отредактировать вопрос, чтобы сосредоточиться на одном вопросе.   -  person Steed    schedule 20.08.2012
comment
Если мне нужно улучшить вопрос (как?), пожалуйста, дайте мне знать.   -  person Steed    schedule 23.08.2012
comment
Кажется, вы объединяете описание того, что вы пытаетесь сделать, описание решения, которое вы предлагаете, и вопрос о том, какое решение использовать. Все это может быть полезной частью хорошего вопроса, но я думаю, вам нужно немного их разделить и уточнить, что именно вы спрашиваете.   -  person tletnes    schedule 24.08.2012
comment
Я просто пытаюсь понять структуру вашего текущего решения. Когда вы говорите «древовидная структура», вы имеете в виду, что это делается в одном классе? Или это набор связанных классов? Данные дублируются =› Почему так? Почему бы вам не сохранить ссылку на соответствующие данные, а не дублировать их? Много работы должно быть сделано, если у вас есть лист => Означает ли это больше работы по реализации или больше времени для запуска? В основном вы ищете решение для оптимизации времени или более удобное/легко кодируемое решение?   -  person PermanentGuest    schedule 24.08.2012
comment
@PermanentGuest, tletnes, я еще раз переписал вопрос, чтобы попытаться ответить на ваши запросы.   -  person Steed    schedule 24.08.2012
comment
@Steed: этот вопрос теперь выглядит намного лучше. Я бы попытался ответить через один-два дня, но сейчас вы наверняка получите хорошие ответы от других.   -  person PermanentGuest    schedule 24.08.2012
comment
Посмотрите и здесь ООСУБД: en.wikipedia.org/wiki/Object_database   -  person S.D.    schedule 29.08.2012
comment
@wingman, спасибо. На первый взгляд GigaBASE выглядит многообещающе.   -  person Steed    schedule 10.09.2012


Ответы (4)


Я не рекомендую СУБД на основе ваших требований к расширяемой и гибкой модели.

  1. Всякий раз, когда вы меняете свою модель данных, вам придется изменить схему БД, и это может потребовать больше работы, чем изменение кода.
  2. Любые проблемы с запросами к БД обнаруживаются только во время выполнения. Это может иметь большое значение для стоимости обслуживания.

Я настоятельно рекомендую использовать стандартное объектно-ориентированное программирование C++ с STL.

  1. Вы можете использовать инкапсуляцию, чтобы убедиться, что любое изменение данных выполнено правильно, с обновлениями связанных объектов и индексов.
  2. Вы можете использовать STL для создания высокоэффективных индексов данных.
  3. Вы можете создавать фасады, чтобы легко получать информацию, вместо того, чтобы переходить к нескольким объектам/коллекциям. Это будет разовая работа
  4. Вы можете создавать модульные тестовые примеры для обеспечения правильности (намного проще по сравнению с модульным тестированием с базами данных).
  5. Вы можете использовать полиморфизм для создания различных типов объектов, различных типов анализа и т. д.

Все очень основные моменты, но я считаю, что ваши усилия будут лучше всего использованы, если вы улучшите текущее решение, а не будете искать решение на основе БД.

person Sameer    schedule 29.08.2012
comment
На самом деле я сделал все это на C++ без БД. Просто больше абстракции и более общий код. Спасибо за Ваш ответ. - person Steed; 28.11.2012

Возможно, вы захотите взглянуть на технологии Semantic Web, такие как RDF, RDFS и OWL, которые обеспечивают альтернативный, расширяемый способ моделирования мира. Есть несколько доступных тройных хранилищ с открытым исходным кодом, и некоторые из основных СУБД также имеют возможности тройного хранилища.

В частности, взгляните на учебник Manchester Universities Protege/OWL: http://owl.cs.manchester.ac.uk/tutorials/protegeowltutorial/

И если вы решите, что это направление заслуживает дальнейшего изучения, я могу порекомендовать "СЕМАНТИЧЕСКИЙ ВЕБ для РАБОТАЮЩЕГО ОНТОЛОГА"

person Seb Rose    schedule 27.08.2012
comment
Учебник OWL захватывающий! Спасибо за ответ. Мне потребуется время, чтобы прочитать и понять, а также решение шипра. Может быть, я должен создать две награды ..;) - person Steed; 28.08.2012

Просто основываясь на диаграмме, я бы предположил, что решение RDBMS действительно будет работать. Прошли годы с тех пор, как я был разработчиком RDMS (конечно, называемой RDM!), но я смог обновить свои знания и получить очень много ценных сведений о структуре данных и макете, очень похожем на то, что вы описываете, читая невероятную Книга Стефана Фарулта «Искусство SQL». Его книга будет иметь большое значение, чтобы ответить на ваши вопросы.

Я включил ссылку на него на Amazon, чтобы обеспечить точность: https://rads.stackoverflow.com/amzn/click/com/0596008945

Вы не ошибетесь, прочитав ее, даже если в конце концов она не решит вашу проблему полностью, потому что автор проделал огромную работу по четкому изложению отношений и представлению элегантных решений. Эта книга не руководство по SQL, а глубокий анализ того, как думать о данных и как они взаимосвязаны. Проверьте это!

Использование РСУБД для отслеживания связей между данными может быть эффективным способом хранения и обдумывания необходимого анализа, а связи являются «мягкими», то есть они исчезают, когда удаляются жесткие объекты, на которые они ссылаются. Это обеспечивает целостность данных; и г-жа Форулт может ответить, что нужно сделать, чтобы это осталось верным.

person shipr    schedule 24.08.2012
comment
Спасибо за ответ! Я проверю книгу, как только получу ее. Можете ли вы назвать какие-либо недостатки или каверзные моменты реализации решения СУБД (не описанные в книге)? - person Steed; 24.08.2012
comment
Я не могу назвать конкретных недостатков, кроме того, что данные хранятся на диске с помощью механизма СУБД и не полностью хранятся в памяти, но, конечно, это может быть преимуществом. Самая сложная часть будет заключаться в том, чтобы правильно установить отношения и поддерживать их при удалении данных; но эти вещи книга хорошо описывает. - person shipr; 28.08.2012

http://www.boost.org/doc/libs/1_51_0/libs/multi_index/doc/index.html

«вы приложите очень много усилий, чтобы поддерживать согласованность этих указателей и постоянно обновлять ссылки, когда что-то меняется».

С помощью Boost.MultiIndex вы можете создать практически любой индекс для «таблицы». Я думаю, что указанная проблема не так серьезна, поэтому оригинальное решение решаемо.

person Industrial-antidepressant    schedule 25.08.2012
comment
Спасибо за ответ, но я не сразу понимаю, как я могу использовать multi_index для своей проблемы. Не могли бы вы немного пояснить, пожалуйста? - person Steed; 27.08.2012