【发布时间】:2014-11-12 01:48:22
【问题描述】:
我在工作中遇到了迁移问题。现在我们有一个数据库,我们的网站和后台工具都在使用它。 作为尝试改进网站代码的一部分,我们为数据库中的几个表设计了一个新模式。
我们以 products 表为例。这是相当标准的字段,如描述、名称、产品代码、价格、创建日期等。我们现在有一个新表,我们称之为 better_products。问题是,我们可以随心所欲地更改网站代码,但我们无法触及严重依赖旧产品表的后台工具代码。
我们最终会在生产环境中出现后台工具正在写入旧产品表,而网站正在读取新的 better_products 表的情况。问题是,我们如何让它们保持同步?我已经在谷歌上搜索了一段时间,到目前为止,最常见的解决方案是使用触发器,并将传入的数据映射到新表。我已经为产品编写了 AFTER INSERT 触发器,但是当我去编写 UPDATE 触发器时,结果发现无法遍历触发器内部更改的字段并将它们映射过来。这意味着手动写出字段 'IF NEW.fieldName OLD.fieldName THEN' 这很难看,需要手动列出字段。
有没有更好的方法?一个半更好的方法?除了逐个字段地写出这个之外还有什么? 有没有比使用触发器更好的做法?
请不要建议更改后台工具,因为目前这不是一个现实的选择。这是计划好的,但还不足以让我们等待。
【问题讨论】:
-
如何使用视图?并且只使用后台应用程序中的视图.. 比如
create view as foo SELECT IF(new.fieldName <> oldFieldNAme, whatever, else) as fieldNameYouWant .... -
新系统中的行实际上是只读的,还是新系统在其中存储了必须在后台系统的 UPDATE 之间保留的数据?
-
@busse 网站只从这些表中读取,但后台读取和写入。
-
@Rufinus 正如我所提到的,我至少要再过 2.5-3 个月才能使用后台工具,这对我来说太长了,因为我们很快就会有新的表格。
-
删除了我的答案,因为 JeffO 的答案是正确的,因为您不是在网络端写作。只需让新表成为旧表的视图,直到您可以重写后台工具。
标签: php mysql migration mapping