我想检查这是否是一个逻辑设置。我是数据库的新手,但我想节省一些空间并提高效率。
正在生成员工的每日快照(每天50,000多行,超过70列)。我只对更改发生时感兴趣,因此我删除了重复项,然后为effective_date
和expiration_date
以及is_current
添加了一列。每当我跟踪的维度发生变化时,我都会为该员工添加一个新行。
生成了大量文件,其中包含有关这些员工的日常事实。每个文件都有employee_id
和date
,这些文件也存在于每日员工快照文件中。
我在考虑在快照文件上添加一个整数键(递增),然后查找该整数并将其添加到事实表中(我将在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... |
当我将日期快照文件(在有效日期和到期日期之间)加入某个日期时,此整数应反映特定员工。这是一个不错的方法,还是我应该尝试别的东西?
答案 0 :(得分:1)
避免使您的方法复杂化。 KISS方法。 在发生更改时,您将获得一个新的csv文件。只需插入一下即可找到所有内容。让您的SQL表具有标识列以及在该csv上找到的所有列。
实际上,我会使用SQL Server提供的“导入和导出数据”工具,这样您就可以将csv文件的列与表格相匹配。 搜索与日期和/或员工相关的内容时:
SELECT * FROM Emp_table
WHERE effective_date < @dateSearched
AND expiry_date > @dateSearched
AND employee_id = @employeeSearched
您希望拥有一个标识列来帮助编制索引。当然,该表将有很多行,但SQL服务器无法处理它。
最后,如果您关注重复项(完全相同的行 - 当然减去标识列),请研究如何删除SQL Server中的重复项。这篇kb文章很理想:https://support.microsoft.com/en-ca/kb/139444