我一直觉得使用对象数据库(例如db4o)非常令人困惑的一点是,如何处理通常由SQL/PL-SQL处理的复杂迁移。
例如,假设您在关系型数据库中有一个名为my_users的表。最初,该表包含full_name列,现在在软件版本2中,您希望删除此列,在空格上拆分全名,并将第一个部分放入名为“first_name”的列中,将第二个部分放入名为“last_name”的列中。 在SQL中,我只需填充“first_name”和“second_name”列,然后删除名为“full_name”的原始列即可。
我该如何在db4o中实现这个功能?我需要编写一个Java程序来查找所有User.class的对象,将full_name设置为null,同时设置first_name和last_name吗?当我进行下一次svn提交时,将不再有与full_name对应的字段/bean属性,这会是一个问题吗?似乎在生产应用程序中使用它时,如果我的“模式”发生变化,我需要编写一个脚本来从版本x迁移数据到版本x+1,然后在版本x+2中实际上删除我要摆脱的版本x+1的属性,因为我无法编写Java脚本来修改不再属于我的类型的属性。似乎问题的一部分在于关系型数据库管理系统(RDBMS)基于简单的大小写不敏感字符串名称解析所引用的对象,而在像Java这样的语言中,类型更加复杂,如果getter/setter/field不是运行时加载的类的成员,则无法引用属性,因此您需要在同一脚本中拥有两个版本的代码(嗯,自定义类加载器听起来很麻烦),将新版本的类存储在另一个包中(听起来很混乱),或者使用我提到的版本x+1 x+2策略(需要更多的规划)。也许从db4o文档中我没有发现明显的解决方案。
有什么想法吗?希望这有些意义。