select sum(t.hours)
from timesheets t
where t.dept_code = 'HR'
and t.status = 'VALID'
and t.project_code = 'MYPROJECT'
and t.task = 'BUILD';
反对:
select sum(t.hours)
from timesheets t
join departents d on d.dept_id = t.dept_id
join timesheet_statuses s on s.status_id = t.status_id
join projects p on p.project_id = t.project_id
join tasks k on k.task_id = t.task_id
where d.dept_code = 'HR'
and s.status = 'VALID'
and p.project_code = 'MYPROJECT'
and k.task_code = 'BUILD';
除非有人真的认为下面这些是个好主意:
select sum(t.hours)
from timesheets t
where t.dept_id = 34394
and t.status_id = 89
and t.project_id = 1253
and t.task_id = 77;
在时间点数据库的情况下,最好结合使用代理键和自然键。例如,你需要追踪一个俱乐部的会员信息。成员的某些属性永远不会更改。出生日期,但名字可以更改。
因此,创建一个具有 Member _ id 代理键的 Member 表,并为 DOB 创建一个列。
创建另一个名为 person name 的表,并为 member _ id、 member _ fname、 member _ lname、 date _ update 创建列。在此表中,自然键为 member _ id + date _ update。
Table: JOB with 50 records
CODE (primary key) NAME DESCRIPTION
PRG PROGRAMMER A programmer is writing code
MNG MANAGER A manager is doing whatever
CLN CLEANER A cleaner cleans
...............
joined with
Table: PEOPLE with 100000 inserts
foreign key JOBCODE in table PEOPLE
looks at
primary key CODE in table JOB
案例2: 您的表是一个包含数千条记录的 < strong > 表
使用 代理项/自动增量键。
例如:
Table: ASSIGNMENT with 1000000 records
joined with
Table: PEOPLE with 100000 records
foreign key PEOPLEID in table ASSIGNMENT
looks at
primary key ID in table PEOPLE (autoincrement)
在第一种情况下:
您可以选择表 PEOPLE中的所有程序员,而不使用与表 JOB的连接,只使用: SELECT * FROM PEOPLE WHERE JOBCODE = 'PRG'
也许和这个话题不完全相关,但是处理代理键的问题让我很头疼。Oracle 提前交付的分析在仓库中的所有维度表上创建自动生成的 SK,并将这些 SK 存储在事实上。因此,当添加新列或需要为维度中的所有项填充新列时,任何时候都需要重新加载它们(维度) ,在更新期间分配的 SK 使得 SK 与存储到事实的原始值不同步,从而迫使所有连接到事实表的事实表完全重新加载。我希望即使 SK 是一个毫无意义的数字,也会有某种方式不能改变原始/旧的记录。正如许多人所知,开箱即用很少能满足组织的需求,我们必须不断定制。现在我们的仓库中有3年的数据,从 Oracle 财务系统完成的重新加载非常大。因此,在我的例子中,它们不是从数据输入生成的,而是添加到一个仓库中以帮助报告性能。我明白,但我们的生活会改变,这简直是噩梦。