【发布时间】:2016-10-12 06:51:06
【问题描述】:
我正在写我的学士论文。它的目标是用 C++ 编写对象数据库(类似于 CoreData)。其中一项要求是支持反射关系(1-1,1-M,M-M)和动态对象加载。
我当前的设计由带有代码生成功能的简单 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++ 来说显然是错误的,因为存储这样的所有内容都需要每个字段都是自定义类,该类在每个字段访问中都引用了所有者和动态转换,而且我什至没有谈论存储其他类,它们使用自定义共享指针(它是一个模板,因此动态转换不起作用)。
另外,元数据有问题,我如何在这个系统中定义模式?我可能可以使用访问者,访问所有字段,并使用一些宏技巧来检索他们的名称和类型,但是自反关系?我不知道。
在我的方法中,我可以以某种方式对添加的字段进行版本化并为它们生成迁移代码。 (将模式版本存储在持久数据库中,然后,当我打开这个数据库时,检查版本并运行生成的迁移代码)。
我在这里缺少什么吗?我的方法完全错误吗?
【问题讨论】:
标签: c++ core-data object-oriented-database