數據庫學習筆記–Database Design(1)

需求分析:

今天天氣很好,早上去交了電費,中午和晚上都煮了餛飩。昨天把《數據庫系統概念》這本書從公司又扛了回來。今天看了點,就是第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…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章