【问题标题】:Best way to map a mysql table to new table with different field names将mysql表映射到具有不同字段名称的新表的最佳方法
【发布时间】: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


【解决方案1】:

在 mysql 数据库中创建一个名为 better_products 的视图,它是对旧产品的选择语句,但列名已更改。

最终,您可以更新后台应用程序中的代码以使用此视图。一旦两个系统都使用了新视图,该视图可以被一个名为 better_products 的实际表替换,该表复制了旧表中的所有数据。

【讨论】:

  • 所以基本上网站会从视图中读取它的数据?这将如何影响网站方面的性能?
  • 这是一个单表查询,所以应该不会对性能造成太大影响。 mysql我不会说话,但大多数rdbms都能应付。
  • 在与队友讨论后,我们决定使用脚本生成的触发器,但我选择了您的答案,因为这似乎是一个不错的方法,可能对其他人有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-02
  • 1970-01-01
  • 2019-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-15
相关资源
最近更新 更多