数据库:汇总过期的数据

时间:2010-10-23 00:59:06

标签: sql database database-design data-warehouse olap

我正在努力为我的数据找到高效灵活的表示。我们在具有任意生命周期的两个实体之间存在多对多关系。我们称这些为VoterCandidate。每个关系都有一个我们想以各种方式总结的衡量标准。这些是带时间戳的,并保证在两个相关实体的生命周期内。假设该指标是支持率,或者只是Rating

一个不寻常的要求是,如果我总结一个没有测量的时期,我应该替换最新的有效测量,而不是给出NULL。

我们目前的解决方案是每天编制一份有效选民和候选人名单,然后制定一个记录最新有效衡量标准的多对多表格。

您的解决方案是什么?

Example diagram

这允许我执行单个查询以获取每日摘要:

   select 
       avg(rating), valid_date, candidate_SSN, candidate_DOB
   from 
       daily_rating natural join rating
   group by
       valid_date, candidate_SSN, candidate_DOB

这可能会有效,但对我来说似乎效率低下。我们正在重复大量数据,特别是如果某一天没有任何反应。目前还不清楚如何在不编制更多表格的情况下进行每周/每月摘要。由于我们正在处理数百万行(我们并未真正谈论选民民意调查......)我正在寻找更有效的解决方案。

2 个答案:

答案 0 :(得分:1)

我在这里使用了数据仓库技术,因此dimfact表名称。

alt text

dimDate 是所谓的日期维度,每个日期一行。

dimCandidate 包含所有候选数据,新旧记录。在数据仓库术语中,这称为类型2维度。一个候选人可以在此表中有多行,其中只有一行有r_status ='当前'。

字段

, r_valid_from date
, r_valid_to   date
, r_version    integer -- (1, 2, 3,..)
, r_status     varchar(10) -- (expired, current)

描述记录(行)状态。每次候选人状态发生变化时,都会插入一个新行,并修改前一行的r_valid_tor_status

CandidateFullName是业务(自然)密钥,必须唯一地标识候选人。没有两个候选人可以拥有相同的CandidateFullName。请注意,CandidateKey唯一标识表中的行,而CandidateFullName唯一标识候选。

dimVoter 有选民数据,新旧记录 - 就像 dimCandidate 一样。

dimCampaign 描述了广告系列详细信息,这是所谓的类型一维,不包含历史数据。

factRating 有评分指标。

Normaly这已经足够了,但是需要在一天内插入缺失的数据;为此,引入了聚合表 aggDailyRating 。在一天结束时,预定的工作会聚合当天的评分。这项工作负责数据插值要求。 这样,聚合表对于每个date-(valid) candidate-campaign组合都有一行。请注意,选民不包括选民,所有选民都会汇总数据。

alt text

任何报告都在聚合表上完成,例如

--
-- monthy rating for years 2009-2010
-- for candidate john_smith_256
--
select
     CalendarYear
   , MonthNumber  
   , avg(DailyRating) as AverageRating
from aggDailyRating as f
join dimDate        as d on d.DateKey      = f.DateKey
join dimCandidate   as c on c.CandidateKey = f.CandidateKey
where CandidateFullName = 'john_smith_256'
  and CalendarYear between 2009 and 2010
group by CalendarYear, MonthNumber
order by CalendarYear desc, MonthNumber desc ;

答案 1 :(得分:1)

是的,这是非常低效和浪费的。它只是一组文件,与一组“表”或“数据库”没有合理的可比性;对它的扩展和增强将加剧重复和低效率。复制是数据库的对立面。在数据库方面,有更有效和更容易的方法来实现它。

<强>假设

你的帖子没有提供太多信息,所以我不得不做出一些假设,但我认为你可以很容易地纠正我的提交,如果它们中的任何一个是不正确的。否则评论,我会更正我的提交。

  1. 选民是一个人;候选人是选民; (候选人=选民的子集)

  2. 广告系列与候选人有关(不适用于投票广告系列)。

  3. 民意调查是对选民对候选人表现的回应的调查,盯着设定的日期,连续几天,并在规定的日期完成。

  4. 每个民意调查中都有许多措施,例如ApprovalRating。

  5. 所有选民的此类调查的衡量标准汇总在民意调查一级。

  6. <强>限制

    1. 到期要求不清楚,所以我并不是说我已经实施了。如果模型没有为您提供(如果不是很明显),请提供详细信息,我将添加到模型中。当前模型为我理解的到期要求提供了排除/包含功能。

    2. Poll :: Measure没有足够的信息可以完全实现;我需要进一步的细节。提交在该领域是原始的和不受约束的。

    3. 同样,任何Poll :: Campaign关系或约束(“每个广告系列有多个投票,并且它们始终与广告系列相关”)尚未实施。

    4. 子表中的键的排列现在是任意的:如果您确定最常见的查询,则可以重新排列,以便获得最佳速度的那些查询。

      < / LI>

      <强>提交

      Campaign Poll Data Model

      1. 这只是一个关系(规范化;零重复)数据库,纯IDEF1X,包括考虑子表巨大的考虑:将窄代理键迁移到子表中,避免迁移宽键

      2. 它提供“数据仓库”功能。实际上,如果它在单个查询中没有提供任何BI或DSS要求,那只是因为您缺乏详细信息;请提供,我很乐意改变它。 (注意,您的项目“单个查询”实际上是“单个文件”;连接是关系数据库中的行人。)

      3. %Code等密钥为2个,3个和最多4个字符。这些键与Integer键一样快,在阅读表时非常有用(有意义)(无需加入父键)。

      4. 任何和所有聚合,无论是加载历史行还是生成当前值的聚合,都应该可以在单个Relational(面向集合)命令中进行;你不应该求助于串行(光标)处理。同样,如果您认为需要,请发表评论,我将提供面向集合的方法。

      5. 我们在DB中实现版本控制的方式与在DW中完成的方式完全不同,并且没有限制。请确定您是否需要(例如)候选人的版本,我将提供。

        最后,Null要求并不罕见。这里迎合了它。再说一遍,如果你认为不是......