数据仓库设计— 如何设计一个星型模型(示列)
- 现有关系型数据库中的表如下
Branch(branchNo, branchName, bStreetAddress, bCity) //分行表
LoanManager(empNo, empName, phone, branchNo) //贷款管理人员表
Customer(custNo, custName, profession, streetAddress, city, state) //客户表
Account(accNo, accType, balance, accDate, custNo) //账单表
LoanContract(contractNo, loanType, amount, loanDate, empNo, custNo) //贷款合同表
- 统计目标如下
1.分行或贷款管理人员的 “合同数量”
2.分行或贷款管理人员的 “贷款总额”
-
设计思路
星型模式都必须有一个中心,而中心事实表包含“度量”和“与其他事实表的关系(维度主键)”。
针对上面的统计目标,Branch 和 LoanManager 将成为维度,而 LoanContract(contractNo) 和 LoanContract(amount) 将成为度量。常见的附加维度是时间,通常是周或季度。 -
设计的模型如下
//维度表
DimBranch ( branchNo, branchName ) //分行表
DimLoanManager ( empNo ) //贷款管理人员表
DimQuarter ( year, qNo ) -- qNo in (1,2,3,4) //季度表
DimWeek ( year, weekNo ) -- weekNo in (0..53), depending on business rules //周表
//事实表 描述一件事情(什么时间 在什么地点 什么人 做了什么事),一般情况是这个星型模型中数据量最大的表
//描述为: 在某年、某季度、某周 在某分行 某贷款管理人员 签了一份 价格为多少 的贷款合同
Fact( year, qNo, weekNo, empNo, branchNo, amount, contractNo )
- 查询sql(示列)
//分行或贷款管理人员的 “合同数量”
select
d.branchName, m.numContracts
from (select count(*) numContracts, branchNo from Fact group by branchNo) m
left join DimBranch d on m.branchNo = d.branchNo
//分行或贷款管理人员的 “贷款总额”
select
d.branchName, m.sumLoans
from (select sum(amount) sumLoans, branchNo from Fact group by branchNo) m
left join DimBranch d on m.branchNo = d.branchNo