【问题标题】:Adding a surrogate key to fact tables?向事实表添加代理键?
【发布时间】:2016-08-10 08:12:11
【问题描述】:

我想检查一下这是否合乎逻辑。我一般是数据库新手,但我想节省一些空间并提高效率。

正在生成员工的每日快照(每天 50,000 多行,超过 70 列)。我只对何时发生更改感兴趣,所以我删除重复项,然后为effective_dateexpiration_date 添加一列以及is_current。每次我跟踪的维度发生变化时,我都会为该员工添加一个新行。

生成了许多文件,其中包含有关这些员工的日常事实。每个文件都有employee_iddate,它们也存在于日常员工快照文件中。

我正在考虑在快照文件上添加一个整数键(递增),然后在插入之前查找该整数并将其添加到事实表(我将在 ETL 设置期间使用 pandas/python 执行此操作)数据存入数据库。

每日快照:

employee_integer_key | effective_date | employee_id | all employee info... |
            86            2016-01-06      abc123            stuff

事实文件:

date | employee_id | facts... |

然后,我将根据日期和employee_id 列合并表,并且仅将employee_id 列替换为employee_integer_key

事实文件:

date | employee_integer_key | facts... |

当我将其与每日快照文件(在生效日期和到期日期之间)加入时,该整数应反映特定日期的特定员工。这是一个不错的方法还是我应该尝试其他方法?

【问题讨论】:

  • 实际发生了什么变化?抓拍的数据?在进行更新时创建自己的更改历史记录表,或者使用更新触发器直接对表进行更新,从而采用编程方式。您最关心的是实时数据,为什么不拆分更改和当前数据?用于广泛查询的仓库更改 + 实时数据可能是有益的。根据定义,代理键是人类可以理解的(您的em​​ployee_id),您正在查看的是一个身份列。
  • 大约有 70 列描述员工。他们在哪个项目上,在哪个位置,他们向谁报告等等。(这些信息是在第三方的每日 .csv 文件中提供的,因此它是来自我们无法访问的更大数据库的非规范化快照)。我在大约 20 列中跟踪“重要”变化。如果其中一个维度发生变化,我会添加一个新行(在将任何内容插入数据库之前,我会在 python 中与旧数据进行比较)。我需要能够准确地知道某个人在某个日期的状态(谁是他们的经理等)。
  • 如果您的设置是这样的,因为您的搜索条件仅基于日期和特定员工,您可以将其全部保存在包含所有字段的单个表中。 Select * from emptable where effective_date dateSearched and employee_id = empSearched。

标签: sql-server database


【解决方案1】:

避免使您的方法复杂化。亲吻方法。 发生更改时,您将获得一个新的 csv 文件。只需插入其中的所有内容即可。让您的 SQL 表有一个标识列以及在该 csv 上找到的所有列。

实际上,我会使用 SQL 服务器提供的“导入和导出数据”工具,这样您就可以将 csv 文件的列与表相匹配。 在搜索与日期和/或员工相关的内容时:

SELECT * FROM Emp_table WHERE effective_date < @dateSearched AND expiry_date > @dateSearched AND employee_id = @employeeSearched

您希望有一个标识列来帮助建立索引。当然,该表会有很多行,但没有什么是 SQL Server 无法处理的。

最后,如果您担心重复项(完全相同的行 - 当然减去标识列),请查看如何在 SQL Server 中删除重复项。这篇kb文章很理想:https://support.microsoft.com/en-ca/kb/139444

【讨论】:

  • 谢谢。为了澄清,我正在创建 csv 来告知发生的变化。原始文件上没有任何指示,也没有生效或到期日期。该信息的提供者每天都会完全覆盖同一个文件,所以我保存它,然后将每日快照合并到我可以看到更改的地方。但基本上听起来我可以只保留日期和员工 ID,而不用担心整数键。
  • 是的,您不需要代理键(事实上,您已经拥有它作为 empId)。不过,在您的表中保留一个标识字段以进行正确的索引。如果你只是做一个插入,你知道如何去获取你需要的信息吗?对员工 ID 进行 CTE 分组并仅返回每个员工的前 1 个可能是可行的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 2011-03-10
  • 1970-01-01
相关资源
最近更新 更多