Я работаю над диссертацией бакалавра. Цель состоит в том, чтобы написать базу данных объектов (похожую на CoreData) на C++. Одним из требований является поддержка рефлексивных отношений (1-1,1-M, M-M) и загрузка динамического объекта.База данных объектов на C++
Мой нынешний дизайн состоит из простого языка DDL с генерированием кода. Пользователь пишет свои классы, которые он хочет сохранить, а затем пишет отношения между этими классами. Что-то вроде этого:
Person {
string name;
int salary;
}
relation Person.boss(1) references Person inverse Person.subs(M);
Из этого я создаю заголовок C++ с определением класса, источником C++ с определениями методов. Класс имеет все примитивные поля как общедоступные, отношения являются частными и доступны только с помощью методов get/set или get/add/remove/clear. В этих методах я сохраняю последовательность рефлексивных отношений. Например: в методе setBoss
я хотел бы сделать следующее:
void setBoss(ptr<Person> val) {
if (boss) {
boss->subs.remove(this);
}
boss = val;
boss->subs.add(this);
boss.modified = true
}
Этот код генерируется все, и работает. Но мой руководитель требует, чтобы я делал это без какой-либо генерации кода и старался следовать за CoreData как можно ближе. Я думаю, его идея состоит в том, чтобы имитировать динамический объект в C++, где каждый объект, который может быть сохранен в базе данных, содержит map<string,value>
и поля, считанные с этой карты. Я думаю, что этот дизайн явно неверен для C++, так как для хранения всего, что требуется для этого, требуется, чтобы каждое поле было настраиваемым классом, который ссылается на владельца и динамический при каждом доступе к полю, и я даже не говорю о сохранении других классов, которые используют пользовательский общий указатель (это шаблон, поэтому динамическое приведение не будет работать).
Кроме того, существует проблема с метаданными, как определить схему в этой системе? Вероятно, я мог бы использовать посетителя, который посещает все поля, а использование какого-то макроопределения получает их имя и тип, но рефлексивные отношения? Я не знаю.
В моем подходе я могу как-то добавить дополнительные поля и создать для них код миграции. (сохранение версии схемы внутри постоянной базы данных, затем, когда я открываю эту базу данных, проверяю версию и запускает сгенерированный код миграции).
Что-то я здесь не хватает? Является ли мой подход совершенно неправильным?
Ну, с моим подходом создание схемы довольно выполнимо, так как я генерирую код, я могу сгенерировать метод, который принимает некоторый «контекстный» объект и вызывает методы «generateTable», 'addAttribute' в этом контексте. Возможны также миграции (добавьте добавленные поля в DDL, затем сгенерируйте с ними код миграции). С моим подходом руководителя, не так много. – semtexzv
«Возможно также миграция (добавьте добавленные поля в DDL, затем сгенерируйте код миграции)» Я прошу не согласиться. Если ваши изменения являются только дополнениями, то * конечно * все будет хорошо. Однако попробуйте изменить 1-M на M-M и посмотреть, что это будет делать с кодом, вызывающим вашу более старую версию. «С моим подходом начальника, не так много». С вашим подходом руководителя нет необходимости. –
Я не понимаю, всегда будет необходимость обновлять схему после миграции. – semtexzv