表1: 一切都包括厨房水槽。日期格式错误(年份最后,因此无法在该列上排序),以VARCHAR形式存储的数字,“街道”列中的完整地址,名字列中的名字和姓氏,姓氏列中的城市,地址不完整,行根据多年来发生变化的一些规则,将数据从一个字段移动到另一个字段,更新前面的行,重复记录,不完整的记录,垃圾记录......你的名字......哦,当然不是TIMESTAMP或PRIMARY KEY栏目在眼前。最终的MySQL遗留数据库噩梦
表2: 正常化的任何希望都在打开婴儿时出现在窗外。 对于表1中的每个条目和行更新,我们都有一行。所以像明天没有(800MB的价值)和像Phone1 Phone2 Phone3 Phone4这些列的复制品... Phone15(他们不叫电话,我用这个插图)foriegn的关键是......好好猜测。根据表1中的行的数据类型,有三种候选者:
表3: 它可能会变得更糟。哦,是的。 “外键是虚线,点,数字和字母的VARCHAR列组合!如果没有提供匹配(通常不会),那么类似产品代码的第二列应该是。与他们内部的数据无关,并且强制性的Phone1 Phone2 Phone3 Phone4 ... Phone15。从表1重复列,而不是TIMESTAMP或PRIMARY KEY列在望。
表4:被描述为工作在任何时刻都有可能发生变化,这与其他人相比是相似的。
在接近1米的行上,这是一个大混乱。幸运的是,这不是我的大混乱。不幸的是,我不得不把它从一个复合记录每个“客户”。
最初,我设计了Table1的四步翻译,添加了PRIMARY KEY并将所有日期转换为可排序格式。然后再执行几步查询来返回已过滤的数据,直到我有了Table1才能使用它从其他表中拉出来形成组合。经过几个星期的工作,我用一些技巧将这个过程变成了一步。所以现在我可以将我的应用程序指向混乱,并提出一个很好的合成数据清理表。幸运的是,我只需要其中一个电话号码用于我的目的,因此我的表正常化不是问题。
但是,这是真正的任务开始的地方,因为每天有数百名员工以您不想要的方式添加/更新/删除此数据库,并且每天晚上我都必须检索新的行。
由于任何表中的现有行都可以更改,并且由于没有TIMESTAMP ON UPDATE列,所以我将不得不使用日志来了解发生了什么。当然,这假定有一个二进制日志,但没有!
引入这个概念就像铅气球一样。我可能告诉他们,他们的孩子将不得不接受实验手术。他们并不是高科技......如果你没有收集到......
这种情况有点微妙,因为他们有我的公司非常需要的一些有价值的信息。我被一家大公司的高级管理人员(你知道他们是怎么做的)发送了“实现它”。
我想不出任何其他方式来处理夜间更新,而不是用另一个应用程序解析bin日志文件,以找出他们在白天对数据库做了什么,然后相应地组合我的表。我真的只需要看看他们的桌子1就可以知道该怎么办我的桌子了。其他表格只提供一些字段来清除记录。 (使用MASTER SLAVE不会有帮助,因为我将有一个副本的混乱。)
另一种方法是为其table1的每一行创建一个唯一的散列并构建一个散列表。然后,我每天晚上都会查看整个数据库,看看哈希是否匹配。如果他们不这样做,我会阅读该记录,并检查它是否存在于我的数据库中,如果存在,那么我会在数据库中更新它,如果它不是它的新记录,我会插入它。这是丑陋的,并不快,但解析二进制日志文件也不是很好。
我已经写了这个,以帮助弄清楚问题。经常告诉别人有助于澄清问题,使解决方案更加明显。在这种情况下,我只是头痛得厉害!
您的想法将不胜感激。
*我可以看到的唯一问题是,如果有些表没有主键。* - 他们不会... 今天他们告诉我他们很少“更新/删除记录”。 ..无论这意味着什么。在与另一位数据库开发人员交谈时,似乎最好的(唯一)方法是正确执行此操作,即对每一行进行散列并将散列存储在表中。然后,每天晚上重新阅读整个数据库,为每一行做一个散列,然后做一个简单的比较。我只是无法看到它的方式。试图破译二进制日志文件只会充满危险。 – 2008-09-20 01:55:22