AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 18446
Accepted
HelloWorld1
HelloWorld1
Asked: 2012-05-28 09:04:33 +0800 CST2012-05-28 09:04:33 +0800 CST 2012-05-28 09:04:33 +0800 CST

合并人员数据后使用代理键?

  • 772

这个问题是关于 sql server 2008 R2 的商业智能。

如果您有一个名为 Jim Brown 的人,他的出生日期和社会安全号码 ( SSN ) 位于三个不同的源系统中。

在 ETL 阶段将三个数据行合并为一个/行后,您是否使用应包含 Jim 的生日和SSN的代理键?

sql-server sql-server-2008
  • 2 2 个回答
  • 1153 Views

2 个回答

  • Voted
  1. Best Answer
    Todd Everett
    2012-05-28T17:07:15+08:002012-05-28T17:07:15+08:00

    代理键是系统分配的唯一值,用于标识实体出现。自然键是企业用来识别实体事件的键。源系统以及您的 BI/数据集成数据库可以使用任一类型来识别实体出现 - 例如您示例中的 Jim Brown。在源系统中,我们将源系统用于标识实体出现的内容称为源密钥。因此,如果您可以拥有 3 个不同的源系统,每个系统都包含 Jim Brown,那么除了自然密钥之外,每个系统都将具有不同的源密钥 - 您已将其标识为 SSN + 生日。ETL 使用的 BI 暂存环境将包括一个键映射表,该表将每个源键映射到为 BI 数据库分配的代理键。例如:

    Person  Table
    Surrogate Key   Name            Birthday     SSN          Other fields
    1                   Jim Brown   9-15-1988    123456789  
    
    Person Key Map          
    Surrogate Key   Source Key  Source System   
    1                   12345           System A    
    1                   230383          System B    
    1                   294829          System C
    

    当要处理针对 Jim Brown 的交易时,它将使用源密钥来自源。假设它的系统 A 具有源密钥 12345,并更新了其他字段之一。ETL 在键映射中查找源键并找到它,并且知道将该事务应用于代理键为 1 的 Person 上的行。

    如果您只有 1 个源系统,生活会很轻松。但是你有 3 个。这就是自然键的用武之地,因为你知道你可以在任何系统中通过使用这 2 个永不改变且对他真实的特征来识别吉姆。现在,假设您集成了系统 D。系统 D 中的 Jim Brown 收到了第一笔交易,系统 D 的源密钥是 AB2945。现在,当 ETL 查看键映射时,它找不到它。但是因为您知道您有多个系统可能包含一个人,所以 ETL 还会在 Person 表上查找自然键,瞧——匹配。现在 ETL 为 System D 也为 Jim Brown 的键映射插入了一个新行。

    所以总而言之,你总是在多源间对同一个逻辑实体进行数据集成时,想使用代理键作为BI数据库表中的PK。您将使用键映射表将其映射到源键,并通过查找 BI 表中的自然键来防止重复(以及自然键上的备用唯一键以确保没有重复)。现在还有很多其他细节需要解决——比如你的自然键真的是独一无二的,你想把它存储在你的键映射中以防止对 Person 的查找,你是否必须处理复合源键,你是否保留了历史源密钥更改,您是否跟踪记录系统和参考系统,如何处理源密钥重用(本身就是一个潜在的非常棘手的问题)等。但是这个简短的总结让您了解自然之间的差异, 代理人, 和源密钥以及在 BI 场景中使用它们的位置。我希望这有帮助...

    • 3
  2. Thomas Stringer
    2012-05-28T09:52:43+08:002012-05-28T09:52:43+08:00

    您正在混淆代理键和自然键。如果您使用当前数据(即“应用程序数据”)作为键,它将是一个自然键(在本例中为复合键)。但是 GUID 或身份字段将被替代。

    在这种情况下,有几件事需要考虑。首先,生日和 SSN 的组合是否总是唯一的?只有您和您的业务领域可以回答这个问题,不幸的是我们不能。

    另一个考虑是这可能不是顺序的。使用标识列作为键的好处在于它将是顺序的(只要您出于任何原因不执行任何标识插入)。当向聚集索引中的插入不是顺序的时,您将遇到页面拆分和可能的严重碎片。

    我希望这些要点对您有所帮助,尽管它们不像大多数事情那样是确定的答案,但“视情况而定”。

    • 1

相关问题

  • 死锁的主要原因是什么,可以预防吗?

  • 我在索引上放了多少“填充”?

  • 是否有开发人员遵循数据库更改的“最佳实践”类型流程?

  • 如何确定是否需要或需要索引

  • 从 SQL Server 2008 降级到 2005

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve