У меня есть приложение C ++, чей набор данных в памяти состоит из набора объектов, к каждому из которых прикреплен набор ключей / значений. Объекты и ключи обозначаются идентификатором int, а значения всегда являются экземплярами одного класса. Идентификаторы ключей уникальны в объекте, идентификаторы объектов уникальны во вселенной.
Это почти map
, за исключением того, что у меня есть дополнительное требование, чтобы я мог перечислить ключи, прикрепленные к конкретный объект. И все это должно быть транзакционным, чтобы я мог откатить изменения, если что-то пойдет не так.
Все это кажется мне полностью стандартной проблемой, для которой я мог бы получить готовый код, но я ' я не смог ничего найти. Может ли кто-нибудь:
(a) сказать мне, как на самом деле называется эта проблема, чтобы я знал, что искать;
(b) предложить любой код, на который мне следует взглянуть.
Обратите внимание, что я хочу, чтобы это было хранилище данных только в памяти, поэтому подходы NoSQL, такие как Berkeley DB, не подходят --- я не хочу продолжать чтение и запись объектов значений (которые являются умеренно сложными).
Пока что я ' Мы нашли либо простые подходы, которые не выполняют транзакции (например, boost_multi_index, или даже просто вложенные карты STL), либо сложные подходы с использованием постоянного хранилища, но ничего между ними. Я мог бы реализовать свой собственный уровень транзакций поверх базового хранилища, но, честно говоря, я бы не стал.
Что мне не хватает?
Изменить : ну, похоже, никто не мог предложить один; поэтому я написал свой собственный. Это на удивление неудобно, но на самом деле не очень много кода. Сейчас это просто класс-шаблон, использующий вложенные карты для хранения, но я рассматриваю возможность перехода на использование boost :: multi_index_container для простоты. Он не отшлифован и, вероятно, изобилует ошибками, но если кто-то думает, что может его использовать, дайте мне знать.
Подробнее Edit : для справки, оказывается, что имя в Google для того, что я ' m ищет базу данных объектов / атрибутов / значений (EAV) .