Как эффективно организовать структуру данных
От: Alex34 Израиль  
Дата: 25.07.18 08:53
Оценка:
Добрыий день,

Имеетсжя следующая структура данных


class Object
{
public:
    int   id ;
    TypeA a ;
    TypeB b ;
    ...


Также имеется репозиториий ( База данных ) , которая хранит обьекты типа Object , назовем ее Object_DB

На данныий момент Репозиторий предоставлает простой метод set/get для извлечения обьекта типа Object по идентификатору ( ключ ).

Задача .

Обьект типа Object приходит по сети , но не как цельная структура , а как отдельные элементы .
Например в одном сообсщении (id, TypeA ) , в другом (id, TypeB )

Именно эти поля необходимо обновить для соответствующего обьекта в БД.
Поскольку обьект не приходит в полном обьеме , то приходиться вынимать из БД существующиий обьект , изменять необходимые поля и запихивать его обратно в БД.

Другое решение , мне кажеться менее правильное и приемлемое , предоставить в Object_DB соответствуюсщие методы для каждого типа

   set ( id , const TypeA& ) ;
   set ( id , const TypeB& ) ;


Вопрос :
Как посоветуете организовать структуры БД Object_DB , а такзже типы ( с указанием методов ) Object , TypeA , TypeB и т.д.
чтобы можно было эффективно обновлять отдельную часть обьекта Object в БД , используя один интерфеийс в Object_DB


   set ( id , const Object& ) ;


Другими словами , чтобы обьекты Object умно копировали только то что необходимо.

Надеюсь вопрос понятен

Спасибо
Re: Как эффективно организовать структуру данных
От: uzhas Ниоткуда  
Дата: 25.07.18 09:09
Оценка:
Здравствуйте, Alex34, Вы писали:

варианты решения могут зависеть от того, какие из ACID гарантий должна давать ваша база
для начала я могу посоветовать вам посмотреть на код mongodb и как там организована работа с объектами типа BSON
Re: Как эффективно организовать структуру данных
От: Qulac Россия  
Дата: 25.07.18 10:27
Оценка:
Здравствуйте, Alex34, Вы писали:

A>Добрыий день,


A>Имеетсжя следующая структура данных



A>
A>class Object
A>{
A>public:
A>    int   id ;
A>    TypeA a ;
A>    TypeB b ;
A>    ...

A>


A>Также имеется репозиториий ( База данных ) , которая хранит обьекты типа Object , назовем ее Object_DB


A>На данныий момент Репозиторий предоставлает простой метод set/get для извлечения обьекта типа Object по идентификатору ( ключ ).


A>Задача .


A>Обьект типа Object приходит по сети , но не как цельная структура , а как отдельные элементы .

A>Например в одном сообсщении (id, TypeA ) , в другом (id, TypeB )

A>Именно эти поля необходимо обновить для соответствующего обьекта в БД.

A>Поскольку обьект не приходит в полном обьеме , то приходиться вынимать из БД существующиий обьект , изменять необходимые поля и запихивать его обратно в БД.

Извлекая объект, вы заодно проверяете, есть ли он в бд. Вдруг если его нет, нужно что-то важное сделать. Не забваем про многопользовательский доступ.

A>Другое решение , мне кажеться менее правильное и приемлемое , предоставить в Object_DB соответствуюсщие методы для каждого типа

A>

A>   set ( id , const TypeA& ) ;
A>   set ( id , const TypeB& ) ; 

A>


A>Вопрос :

A>Как посоветуете организовать структуры БД Object_DB , а такзже типы ( с указанием методов ) Object , TypeA , TypeB и т.д.
A>чтобы можно было эффективно обновлять отдельную часть обьекта Object в БД , используя один интерфеийс в Object_DB

A>

A>   set ( id , const Object& ) ;

A>


Вполне допустимо, просто небольшое нарушение принципов grasp. Есть другой вариант: "ленивая загрузка", так мы проверим что объект есть и лишние поля не будем загружать, правда в этом случае он не очень будет эффективен из-за малого количества данных в объекте.

A>Другими словами , чтобы обьекты Object умно копировали только то что необходимо.


A>Надеюсь вопрос понятен


A>Спасибо


Пожалуйста.
Программа – это мысли спрессованные в код
Re: Как эффективно организовать структуру данных
От: solano  
Дата: 25.07.18 10:48
Оценка:
Здравствуйте, Alex34, Вы писали:

Так и храните в табличке тройки (id, type, value). Если нужен объект, то запрашиваете все записи с искомым id. Если нужно обновить заничение у конкретного объекта, то такая запись находится по id и type.
С наилучшими пожеланиями.
Отредактировано 25.07.2018 10:49 CoremanR . Предыдущая версия .
Re: Как эффективно организовать структуру данных
От: Maniacal Россия  
Дата: 26.07.18 08:24
Оценка:
Здравствуйте, Alex34, Вы писали:

A>Добрыий день,

A>Имеетсжя следующая структура данных
A>
A>class Object
{
public:
    int   id ;
    TypeA a ;
    TypeB b ;
    ...

A>...
A>Другими словами , чтобы обьекты Object умно копировали только то что необходимо.

Передо мной стояла подобная задача недавно. Дополнительно было необходимо изменять/читать записи сразу нескольких таблиц одним запросом. Реализовал следующим способом:
Есть структура верхнего уровня Trace, содержит массив (std::vector) структур Record. Каждая Record это поле table_name (enum) и массив структур Field. Каждая Field это поля field_id(int), type(enum), и бинарные данные (std::vecor<char>). Для работы с этим деревом есть набор функций: пополнение дерева как записей, так и полей (operator <<), операторы преобразования типа (актуально для удобного обращения к бинарным данным структуры Field, как к встроенным или предопределённым в программе типам), а так же обвеска для сериализации и десериализации деревьев для передачи по сети (в моём случае реализовал, как оператор "std::vector<char>& << const Trace&" и "Trace& << const char*").

Ну и, соответственно, в движок БД уходят только заданные в запросе записи и поля, а так же в качестве результата возвращаются только запрошенные или имеющиеся в наличии поля и записи. Реализовать функциональность преобразования Record в class Object и обратно, думаю, труда не составит. id полей и имена таблиц, в принципе, никто не мешает и в виде строки хранить и передавать, если схема БД непостоянна.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.