【问题标题】:Data Modelling multiple table of same type into a single table to aggregate all the table into one single table数据建模多个相同类型的表到一个表中,将所有表聚合到一个表中
【发布时间】:2016-12-14 14:45:12
【问题描述】:

我有一个关于数据建模的问题。假设我有以下表格 3 个学生表格。 Source_table1 包含 A_ID 作为主键和 Name 作为属性。 Source_table2 有 B_ID 作为主键,名称和地址作为其他属性。Source_table3 有 C_ID 作为主键,名称、地址和年龄作为属性。如果我们想创建一个包含该表中所有记录的新表作为 Student Master,我们该怎么做呢?如果我们正在创建一个交叉引用表,那么我们应该如何解决这个问题?

【问题讨论】:

  • 很难说。所有这些表是否都保留有关相同实体的数据?
  • 你想做什么还不清楚。我们了解您要合并表,但是您要维护旧的主键,您要使用 3 个中的 1 个作为合并点吗???您有源表的图像可能也提供了您想要完成的示例
  • 您在表中有关于学生的数据。这些表格来自不同的来源。学生详细信息可以出现在多个表格中,也可以只出现在一个表格中。可以维护旧密钥或使用新密钥。我需要制作一个包含唯一记录的学生主表。不得存在重复记录。由于所有表都有不同的键,但它们可能指向同一记录,另一个表也使用不同的键。那么如何处理呢。

标签: sql-server database entity-relationship data-modeling data-warehouse


【解决方案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 列都可以为空。这是朝着上面的学生表迈出的第一步。

我将首先插入所有完美的一对一匹配,然后将每个源与映射表左连接以获得不匹配的记录。将不匹配的源记录并排排列并排序,可以轻松地在视觉上发现可能的匹配项。这是一项乏味且容易出错的工作,但有时必须不顾一切地完成。对于不一致的地方,我可能会选择最完整/最好看的来源作为基础,并填补其他来源的空白。如果您可以让老师或熟悉实际学生的人参与进来,或者为他们提供可供选择的替代方案,请务必这样做。

更多数据可能非常有用。如果来源有社会安全号码、家庭信息等,这些可以用来匹配学生。我会使用任意数量的查询来找到各种信息之间的完美匹配,并将它们插入到映射表中,然后再进行并排匹配。

您很可能会发现由于设计不佳而导致来源存在内部一致性问题 - 例如同一学生的多条记录。这可能需要在继续之前修复源数据。

对数据关系模型的良好理解对于此类工作非常宝贵,因为您将识别候选键、跟踪依赖关系并遇到异常。

【讨论】:

    猜你喜欢
    • 2020-05-20
    • 1970-01-01
    • 2020-05-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 2015-10-29
    • 1970-01-01
    • 2021-07-05
    相关资源
    最近更新 更多