数据库设计 - 如何跟踪信息并查询表中的最新数据?

时间:2009-11-22 01:12:32

标签: database-design

我们正在尝试跟踪我们部门中的应用程序和单元测试用法,因此我创建了一个数据库来跟踪这一情况。我有一个应用程序表,首先,我在应用程序表中创建了一个 UnitTests 列,但我刚刚意识到这一点,只需将其保留到日期,它将覆盖该应用程序的单元测试历史记录。

由于我希望能够随时间提取数据以生成显示进度的图表,我意识到我需要一个名为 UnitTestTracking 的单独表格,其中包含以下列:

  • ID(primaryKey)
  • APPLICATION_ID(INT)\
  • date_added(datetime)
  • unittestcount(int)

通过这种方式,人们可以每周一次或每月一次在此表中添加新条目,我们将随时间推移显示每个应用程序的进度以及所有应用程序的总数。

现在的一个问题是:如何针对此表编写查询以获取所有应用程序的总计数,因为不同的应用程序将在不同的时间在此表中添加条目?

基本上(在伪SQL中)我需要类似的东西:

“选择应用程序data_added是为该应用程序ID添加的最新日期的所有应用程序中的单元测试计数”

您将如何撰写此查询?

5 个答案:

答案 0 :(得分:6)

我认为人们似乎正在努力实现这一目标。

要解决此问题,您需要两个查询:

  1. 找到每个应用程序ID的最新条目
  2. 使用每个应用程序ID的最新条目为我提供单元测试计数的总和。
  3. 第一个SQL是:

    SELECT application_ID, MAX(date_added) AS lastDateAdded FROM UnitTestTracking GROUP BY application_ID
    

    对于第二个,我们通过嵌套查询来完成这项工作:

    SELECT 
        SUM(unittestcount) 
    FROM 
        UnitTestTracking JOIN 
        (SELECT 
             application_ID, MAX(date_added) AS lastDateAdded 
         FROM 
             UnitTestTracking GROUP BY application_ID) T 
        ON UnitTestTracking.application_ID = T.application_ID AND 
           UnitTestTracking.date_added = T.LastDateAdded
    

    这应该可以满足您的需求,即目前的单元测试总数。

答案 1 :(得分:4)

我认为原始设计有点偏,因此复杂。下面的设计建议每日(或更频繁)条目,但仅针对特定人员的特定应用计算当天。 Kimball星型模式允许按日期,按月,按年,按应用,按人,按职位等方式轻松切片和切块。

unittest_model_01

例如,在2008年,2009年,2010年的所有应用程序中

SELECT  sum(TestCount) AS "Test Count"
FROM    factTest AS f
        JOIN dimApplication AS a ON a.ApplicationID = f.ApplicationID
        JOIN dimPerson AS p ON p.PersonID = f.PersonID
        JOIN dimDate AS d ON d.DateID = f.DateID
WHERE [Year] BETWEEN 2008 AND 2010

在2009年的所有申请中,仅在周五

WHERE [Year] = 2009 AND DayOfWeek = 'Friday'

在2009年的所有申请中,按人称。

SELECT  FullName, sum(TestCount) AS "Test Count"
FROM    factTest AS f
        JOIN dimApplication AS a ON a.ApplicationID = f.ApplicationID
        JOIN dimPerson AS p ON p.PersonID = f.PersonID
        JOIN dimDate AS d ON d.DateID = f.DateID
WHERE [Year] = 2009
GROUP BY FullName

按申请人,按人数,按月计算,但仅限于周末

SELECT  ApplicationName, FullName, [MonthName], sum(TestCount) AS "Test Count"
FROM    factTest AS f
        JOIN dimApplication AS a ON a.ApplicationID = f.ApplicationID
        JOIN dimPerson AS p ON p.PersonID = f.PersonID
        JOIN dimDate AS d ON d.DateID = f.DateID
WHERE [Year] = 2009 AND IsWeekend = 'Yes'
GROUP BY ApplicationName, FullName, [MonthName]

在2000 - 2009年的所有申请中,按月,按月,但仅限于接待员在星期二进行的测试。

SELECT  [Year], [Month], sum(TestCount) AS "Test Count"
FROM    factTest AS f
        JOIN dimApplication AS a ON a.ApplicationID = f.ApplicationID
        JOIN dimPerson AS p ON p.PersonID = f.PersonID
        JOIN dimDate AS d ON d.DateID = f.DateID
WHERE   [Year] BETWEEN 2000 AND 2009
        AND JobTitle = 'Receptionist'
        AND DayOfWeek = 'Tuesday'
GROUP BY [Year], [Month]

在所有申请中,2009年,由拥有两只或更多猫的短人在周末进行测试。

SELECT  sum(TestCount) AS "Test Count"
FROM    factTest AS f
        JOIN dimApplication AS a ON a.ApplicationID = f.ApplicationID
        JOIN dimPerson AS p ON p.PersonID = f.PersonID
        JOIN dimDate AS d ON d.DateID = f.DateID
WHERE [Year] = 2009
      AND IsWeekend = 'Yes'
      AND IsShortPerson ='Yes'
      AND CatsOwned >= 2

等等...

语法是sql server,但这里没什么特别的。

<强>更新
请注意FROM ... JOIN ... JOIN ... JOIN ...始终相同。所有切片和切块都是通过SELECT, WHEREGROUP BY完成的 - 无需“复杂查询”。

答案 2 :(得分:1)

您可以使用审核。这将创建您想要的日志。

要分隔不同的应用程序和单元测试,您可以为每个应用程序创建单独的用户。 它将简化查询谁测试的内容。

答案 3 :(得分:1)

这两个选项中的任何一个都适用于您的场景:

1具有为应用程序添加新单元测试计数的逻辑,在历史记录中插入记录+更新应用程序记录的单元测试计数。然后使用简单的选择覆盖应用程序记录 - 历史记录在此方案中无关。如果您在历史记录中有大量记录,这是最好的。

2直接对UnitTestTracking表使用此查询

select application_id, unittestcount from UnitTestTracking u1 
where date_added = ( 
   select max(date_added) from UnitTestTracking u2 
   where u1.application_id = u2.application_id 
)

答案 4 :(得分:0)

“选择应用程序data_added是为该应用程序ID添加的最新日期的所有应用程序中的单元测试计数”

我担心我只能说这种要求的表述似乎一定是有缺陷的。

首先,查询中唯一的“自由变量”(即唯一的参数)似乎是“该应用程序ID”。

所以你的问题陈述似乎是:

(1)给定应用程序ID,获取该应用程序ID的最新(即MAX(...))date_added。 (2)鉴于最新日期,给我所有date_added等于(1)结果的应用程序 (3)鉴于该组应用程序,请给出“跨这些应用程序”的单元测试计数

第二:关于“跨越这些应用程序”,我必须说,我对关系代数的理解和对自然语言的理解都不能帮助我最直接地了解你的意思(特别是)。