现在的位置: 首页 > 综合 > 正文

数据库学习笔记–Database Design(1)

2013年02月19日 ⁄ 综合 ⁄ 共 2454字 ⁄ 字号 评论关闭

需求分析:

今天天气很好,早上去交了电费,中午和晚上都煮了馄饨。昨天把《数据库系统概念》这本书从公司又扛了回来。今天看了点,就是第6章–Database Design
and the E-R
Model。这本书是在我们寝室胖子的建议下买的,3年了,都没有怎么看。今天在凸窗上晒被子,就躺在那里看了一点点。由于阳光晒屁股,看着看着就睡着了。

我一直觉得什么是理解了呢,就是能用自己的话把学到的东西按照自己的理解说出来,并且要让别人听懂。数据库系统概念的阐述方式有点学究,列了不少像{(e1,e2,…,en)|e1<-E1,e2<-E2,…,en<-En}这样的东西,不是很直观。我试着说的通俗一点点。

假设要为小健健要开银行了,需要设计一个系统,大致是这样一些需求:

1.
小健健银行现有好几个支行(branches)组成的。每个支行都有一个唯一的名字(branch_name)。我们还要记录该支行的地址(branch_city),资产情况(assets)。

这个还是挺简单的,定义实体表branch=(branch_name
,branch_city,assets)。下划线表示主键。这里解释一下什么叫’主键’,主键就是能够唯一标识表中的一条记录的信息。你可以用主键的值唯一的定位表中的一条记录。比如我有了你的身份证号码,就可以在中国唯一的定位你这个人。为什么叫实体表呢,因为这是表述一个实实在在东西(entity),还有一种叫关系表(Relationship),每个实体表里面有好多记录,每条记录就是一个实体,比如branch表里面的每一条记录都代表一个支行。每一条记录都有很多属性(attribute/property)组成,像这里,有3个属性,支行名字,地址和资产。

2.
小健健银行的每个客户都有一个唯一的ID(customer_id),我们还要存储客户的个人信息,比如姓名,住址,联系方式。

定义实体表
customer=(customer_id
,customer_name,customer_addr,contact_info)。注意不能用customer_name作为主键,因为会有同名同姓的人。

3.
银行的每个雇员都有一个唯一的ID(employee_id),银行存储每个雇员的名字,住址,联系方式,该雇员的工资,领导的employee_id,当然还有第一天报到的日期以及在小健健银行的工龄。

定义实体表employee =
(employee_id
,employee_name,employee_addr,contact_info,salary,manager_id,start_date)。

3.
每个客户都可以在小健健银行建立帐号,小健健银行实际上可以提供两种帐号,储蓄帐号和投资帐号。每个帐号都有一个唯一的帐号ID,银行当然要存储帐号中有多少钱。储蓄帐号里面的钱是固定利率的;投资帐号里的钱小健健银行有专门的投资顾问帮客户理财哦!理财账户需要手续一定的佣金。一个帐号可以有多个客户共享,每一个客户也可以开多个帐号的。

saving_account = (account_number
, balance, interest);

invest_account = (account_number
, balance, handling_fee);

这里注意到一点,一般储蓄账户和投资账户其实都是账户,只是功能有点不同;前面提到的客户和雇员,如果小健健银行的雇员也把钱存在小健健银行呢,那他们同时也是客户啊,这里有个非常重要的概念:specialization/generalization。我在以后展开,为了方便,我这里先generalize一下下,只考虑account=(account_number
,balance)。

客户存钱的这个动作deposit, 我们用relationship来表示,这是个多对多的关系(many-to-many):

定义关系表deposit=(customer_id, account_number
)。

为了管理方便,需要知道开户行。所以定义关系表 account_branch=(account_number
, branch_name)。

4.
小健健银行还提供房贷车贷业务。每笔贷款有唯一的loan_number标识。可以多个客户一起贷款,比如小夫妻一起买房的。单个客户也可以贷多笔款子。办理贷款手续只需要到就近的支行就可以了,小健健要求,哪个支行贷出去的款子,就由该支行负责收回!

定义实体表loan = (loan_number
, amount)。

客户贷款是牵涉到客户和贷款之间的一个多对多关系: 定义关系表borrow=(customer_id, loan_number
)。

由于要保证优质贷款,我要知道是哪个支行放的款,所以定义关系表 loan_branch = (loan_number
,
branch_name)。

还贷的时候,每笔还贷由payment_number,payment_date和payment_amount组成,这里要注意其实payment_number并不能唯一标识一笔还贷,因为只有对于同一笔贷款,payment_number才是唯一的。比如小明问银行贷了20万,小红贷了20万。在3月15日,小明的第一笔还款(payment_number=1)和小红的第一笔还款(payment_number=1)都是3000元。这个时候就一定要有loan_number才能区分了。这其实是个weak
entity概念。这里不展开了,定义:

payment = (loan_number,payment_number
,payment_date,payment_amount);

其实最好是画一张E-R图,就很直观了,不过我手头没有很好的工具。这一节很简单,只是个大概,下一篇针对上面的4点,深入下去,介绍一些具体的技巧和规则,比如Redundancy/Combination
of Schema, Representation of Generalization…

抱歉!评论已关闭.