表格1:
一切包括厨房水槽。日期格式错误(去年,因此无法对该列进行排序)、存储为 VARCHAR 的数字、“街道”列中的完整地址、名字列中的名字和姓氏、姓氏列中的城市、不完整的地址、通过根据多年来更改的一组规则将数据从一个字段移动到另一个字段来更新前面的行,重复记录,不完整记录,垃圾记录......凡是你能想到的......哦,当然不是 TIMESTAMP 或 PRIMARY关键列就在眼前。
表2:
当这个婴儿被打开时,任何正常化的希望都破灭了。
我们为表一中的每个条目和行更新设置一行。因此,像没有明天这样的重复项(价值 800MB)和诸如 Phone1 Phone2 Phone3 Phone4 ... Phone15 之类的列(它们不称为电话。我用它来说明)外键是..我们猜一下。根据表 1 中的行中的数据类型,有 3 个候选者
表3:
还能变得更糟吗。哦是的。
“外键是短划线、点、数字和字母的 VARCHAR 列组合!如果它不能提供匹配项(通常不会),则类似产品代码的第二列应该提供。具有以下名称的列与其中的数据没有关联,并且必须使用 Phone1 Phone2 Phone3 Phone4...Phone15。有从 Table1 复制的列,但看不到 TIMESTAMP 或 PRIMARY KEY 列。
表 4:被描述为正在进行中的工作,随时可能发生变化。它本质上与其他类似。
在接近 100 万行时,这是一个很大的混乱。幸运的是,这不是我的大麻烦。不幸的是,我必须从中提取每个“客户”的合成记录。
最初,我设计了 Table1 的四步转换,添加主键并将所有日期转换为可排序格式。然后再进行几个查询步骤,返回过滤后的数据,直到我有了 Table1 ,我可以使用它从其他表中提取数据以形成组合。经过几周的工作,我使用一些技巧将其简化为一个步骤。所以现在我可以将我的应用程序指向混乱的地方并拉出一个漂亮干净的合成数据表。幸运的是,我只需要其中一个电话号码来实现我的目的,因此标准化我的桌子不是问题。
然而,这才是真正的任务开始的地方,因为每天都有数百名员工以您无法想象的方式添加/更新/删除该数据库,并且每天晚上我都必须检索新行。
由于任何表中的现有行都可以更改,并且由于没有 TIMESTAMP ON UPDATE 列,因此我将不得不求助于日志来了解发生了什么。当然,这假设有二进制日志,但实际上不存在!
这个概念的推出就像铅气球一样坠落。我还不如告诉他们,他们的孩子将不得不接受实验性手术。它们并不完全是高科技......以防万一你没有聚集......
情况有点微妙,因为他们掌握了我公司急需的一些有价值的信息。一家大公司的高级管理层(你知道他们是怎样的)派我去“实现这一目标”。
我想不出任何其他方法来处理夜间更新,除了使用另一个应用程序解析 bin 日志文件,找出它们白天对该数据库做了什么,然后相应地组合我的表。我真的只需要查看他们的 table1 就可以知道如何处理我的桌子。其他表仅提供用于刷新记录的字段。 (使用 MASTER SLAVE 不会有帮助,因为我会得到混乱的副本。)
另一种方法是为其 table1 的每一行创建一个唯一的哈希并构建一个哈希表。然后我每天晚上都会检查整个数据库,检查哈希值是否匹配。如果它们不存在,那么我会读取该记录并检查它是否存在于我的数据库中,如果存在,那么我会在我的数据库中更新它,如果不存在,那么它是一个新记录,我会插入它。这很丑陋而且速度不快,但是解析二进制日志文件也不是很好。
我写这篇文章是为了帮助弄清楚这个问题。经常告诉别人有助于澄清问题,使解决方案更加明显。这样的话我就更头疼了!
我们将不胜感激您的想法。