当前位置:  开发笔记 > 编程语言 > 正文

最终MySQL遗留数据库的噩梦

如何解决《最终MySQL遗留数据库的噩梦》经验,为你挑选了0个好方法。

表1:包括厨房水槽在内的一切.日期格式错误(年末,因此您无法对该列进行排序),存储为VARCHAR的数字,"street"列中的完整地址,firstname列中的firstname和lastname,lastname列中的city,不完整的地址,行数根据多年来发生变化的一些规则,重复记录,不完整记录,垃圾记录......将数据从一个字段移动到另一个字段,从而更新前一行...您可以将其命名为...哦,当然不是TIMESTAMP或PRIMARY KEY栏目即将来临.

表2:打开这个婴儿后,任何正常化的希望都消失了.对于表1中的每个条目和行更新,我们都有一行.所以复制品就像没有明天(800MB价值)和像Phone1 Phone2 Phone3 Phone4 ... Phone15这样的列(它们不叫电话.我用它来说明)foriegn键是......好好猜测.根据表1中行的数据类型,有三个候选项

表3:它会变得更糟吗?哦,是的."外键是短划线,点,数字和字母的VARCHAR列组合!如果不提供匹配(通常不提供),那么类似产品代码的第二列应该.具有名称的列与它们内部的数据没有关联,并且必须与Phone1进行电话交换... Phone15.从Table1复制列,而不是TIMESTAMP或PRIMARY KEY列.

表4:被描述为一项工作,并且随时可能发生变化.它与其他人相似.

在接近1米的行中,这是一个很大的混乱.幸运的是,这不是我的大混乱.不幸的是,我必须为每个"客户"提供一份复合记录.

最初,我设计了Table1的四步翻译,添加了一个PRIMARY KEY并将所有日期转换为可排序的格式.然后是几个返回过滤数据的查询步骤,直到我将Table1用于从其他表中拉出以形成合成.经过数周的工作,我使用一些技巧将其降低到一步.所以现在我可以将我的应用程序指向混乱并提取一个很好的合成数据表.幸运的是,我只需要一个电话号码,因此我的桌子正常化不是问题.

然而,这是真正的任务开始的地方,因为每天都有数百名员工以您不想要的方式添加/更新/删除此数据库,每天晚上我必须检索新行.

由于任何表中的现有行都可以更改,并且由于没有TIMESTAMP ON UPDATE列,因此我将不得不求助于日志以了解发生了什么.当然这假设有一个二进制日志,但没有!

介绍这个概念就像铅气球一样.我不妨告诉他们,他们的孩子将不得不接受实验性手术.他们并不完全是高科技...如果你没有聚集......

这种情况有点微妙,因为它们有一些我公司非常想要的有价值的信息.我被一家大公司的高级管理人员(你知道他们是怎么做的)发送给"实现它".

我想不出处理夜间更新的任何其他方法,比用另一个应用程序解析bin日志文件,弄清楚他们在白天对该数据库做了什么,然后相应地合成我的表.我真的只需要看看他们的table1来弄清楚该怎么做我的桌子.其他表只提供清除记录的字段.(使用MASTER SLAVE无济于事,因为我会有一塌糊涂.)

另一种方法是为table1的每一行创建一个唯一的哈希,并构建一个哈希表.然后我会每晚检查整个ENTIRE数据库,看看哈希值是否匹配.如果他们没有那么我会读取该记录并检查它是否存在于我的数据库中,如果确实存在,那么我会在我的数据库中更新它,如果它没有那么它是一个新的记录,我会插入它.这很难看并且不快,但解析二进制日志文件也不是很好.

我写这篇文章是为了帮助弄清楚这个问题.经常告诉别人有助于澄清问题,使解决方案更加明显.在这种情况下,我只是有一个更大的头痛!

非常感谢您的想法.

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有