我对数据建模有疑问。假设我有以下表3学生表。 Source_table1包含A_ID作为主键,Name作为属性。 Source_table2将B_ID作为主键,名称&作为其他属性的地址.Source_table3将C_ID作为主键,将Name,Address和Age作为属性。如果我们想要创建一个新表作为Student Master,并且该表中包含所有记录,我们该怎么做?如果我们要创建交叉引用表,那么我们应该如何处理该问题呢?
答案 0 :(得分:1)
整合来自不同来源的数据非常复杂。最后,你想得到类似的东西:
student (student_id PK, name, address, source1_id, source2_id, source3_id)
但是,要解决这个问题还有一些问题需要解决。
<强>身份强>
您如何识别不同来源的匹配记录?看起来您的源使用代理标识符,但这些标识符在源数据库的上下文之外没有任何意义。您正在寻找的是一个合适的自然键。这些来源中唯一的共同点是学生的名字,但名字是众所周知的不良标识符。
实际测试数据可能很有用,而不是假设它将会或不会起作用。例如,查询如:
SELECT s1.name, COUNT(*) AS amount
FROM student_source_1 s1
INNER JOIN student_source_2 s2 ON s1.name = s2.name
GROUP BY s1.name
HAVING COUNT(*) > 1
重复(student_source_2,student_source_3)和(student_source_1,student_source_3)可以让您深入了解问题的大小。
您可以根据姓名和地址匹配student_source_2和student_source_3。这可能会产生更好的结果,或者更糟糕的是,如果两个来源对同一个学生有不同的地址(或拼写)。这让我们想到了第二个问题:
<强>不一致强>
假设您可以解决身份问题,您可能需要处理不一致的数据。如果源2和3对同一个学生有不同的地址怎么办?你如何确定正确的地址?
在某些情况下,只需在不解决不一致的情况下映射来源就足够了。
在现实世界中取悦它
我在较难的情况下使用的一种技术是手工构建映射表,例如
student_map (student_id PK, source1_id, source2_id, source3_id)
每个source_id列都应该有一个唯一约束,通常所有3都可以为空。这是迈向上面学生表的第一步。
我首先插入所有完美的1对1匹配,然后将每个源与映射表连接起来以获得不匹配的记录。并排排列不匹配的源记录并进行排序,可以轻松地在视觉上发现可能的匹配。这是一项单调乏味且容易出错的工作,但有时候无论如何都必须这样做。对于不一致,我可能会选择最完整/最佳的源作为基础,并填补其他来源的空白。如果您可以让老师或熟悉实际学生的人参与其中,或者向他们提供可供选择的替代方案,请务必这样做。
更多数据非常有用。如果来源有社会安全号码,家庭信息等,这些可用于匹配学生。在进行并排匹配之前,我会使用任意数量的查询来查找各种信息之间的完美匹配,并将它们插入到映射表中。
您可能会发现源由于设计不佳而存在内部一致性问题 - 例如同一个学生的多个记录。这可能需要在继续之前修复源数据。
对数据的关系模型有一个很好的理解对于这类工作是非常宝贵的,因为你将识别候选键,遵循依赖关系并遇到异常。