假设你在Hive中启动一个应用程序,使用以下DB模式:
box.put('schema', {'foo': true, 'bar' : 2, 'baz': 'baz'});
一段时间后,你启动了一个新版本的应用程序,假设模式更改了名称,如下所示:
box.put('schema', {'f00': true, 'b@r' : 2, 'baz': 'baz'});
对客户已经存在的数据库采取什么最佳方法?
无论Flutter上下文如何,这似乎都是一般的No-SQL数据库使用。
使用No-SQL数据库意味着他们不倾向于有迁移协议,因为它的重点是读写速度快,效率高。
大多数时候,当处理No-SQL数据库时,数据的整个结构存在于代码中,而不是在数据库中。这与SQL数据库完全相反。
蜂巢在类中有一种方法来处理这种更改https://docs.hivedb.dev/#/custom-objects/generate_adapter?id=updating-a-class即使这样,也要记住文档中说,如果更改字段编号,将失去结构。
仍然不考虑Flutter,你需要记住,当与No-SQL数据库工作时,无论编码语言如何,为了从这个:
盒子。把("模式",{"foo":真的,"酒吧":2,"记者":"记者"});
:
盒子。把("模式",{f00:真的,"b@r":2,"记者":"记者"});
仍然支持两者。你需要编写同时支持这两个条目的代码,而且每次你读取旧格式时,你都必须决定是保留它并同时支持这两个条目,还是将旧格式更改为新格式。
还要注意,从旧格式到新格式的更改应该在使用时读取它们时进行。
因为要一次更改所有条目,您将不得不读取和重写数据库中的所有条目,这将是非常低效的。
因为在No-SQL中,每个单独的条目(文件,文档,.json)没有严格的格式,这意味着它们可以以任何你认为合适的方式存储任何东西,即使它们属于同一个存储/表。在这种类型的数据库中,像在SQL中那样更改表中的列名是不存在的。