1.概念模型
概念模型是對真實(shí)世界中問題域內(nèi)的事物的描述,不是對軟件設(shè)計(jì)的描述。當(dāng)我們要完成一個(gè)軟件系統(tǒng)時(shí),需要把系統(tǒng)中的實(shí)體抽取出來,形成概念模型。例如部門、員工都是系統(tǒng)中的實(shí)體。概念模型中的實(shí)體最終會(huì)成為Java中的類、數(shù)據(jù)庫中的表。今天我們需要了解的概念模型包括以下兩個(gè):
- 對象模型:針對java中的實(shí)體類,例如我們之前學(xué)習(xí)的domain層中的User類等;
- 關(guān)系模型:對應(yīng)數(shù)據(jù)庫中的表。
在java中有以下三個(gè)關(guān)系描述:
- is a:例如貓是動(dòng)物,表示繼承關(guān)系;
- has a:例如人有兩只手,表示的是類與成員的關(guān)系;
- use a:表示類與方法之間的關(guān)系;
我們今天主要關(guān)注的是第二個(gè)關(guān)系:類與成員的關(guān)系。這種關(guān)聯(lián)關(guān)系可以分為如下三種:
- 一對一關(guān)聯(lián):例如老公和老婆就是一對一的關(guān)系,一個(gè)老公只能有一個(gè)老婆,而一個(gè)老婆只能有一個(gè)老公;
- 一對多關(guān)聯(lián):例如每個(gè)員工都從屬一個(gè)部門,而一個(gè)部門可以有多個(gè)員工,其中員工是多方,而部門是一方,從部門角度來說就是一對多,而從員工角度來說就是多對一;
- 多對多關(guān)聯(lián):老師與學(xué)生的關(guān)系就是多對多,一個(gè)老師可以有多個(gè)學(xué)生,一個(gè)學(xué)生可以有多個(gè)老師。
概念模型在java中對應(yīng)這實(shí)體類,在實(shí)體類中使用成員變量完成關(guān)聯(lián)關(guān)系,而且一般都是雙向關(guān)聯(lián),以下是java中實(shí)體類與成員之間的關(guān)聯(lián)關(guān)系,如下所示:
class Employee {//多方關(guān)聯(lián)一方
...
private Department department;//在員工類中關(guān)聯(lián)部門類
}
class Department {//一方關(guān)聯(lián)多方
...
private List<Employee> employees; //在部門類中關(guān)聯(lián)員工類
} |
class Husband {//一方關(guān)聯(lián)一方
...
private Wife wife; //在丈夫類中關(guān)聯(lián)妻子類
}
class Wife {//一方關(guān)聯(lián)一方
...
private Husband husband; //在妻子類中關(guān)聯(lián)丈夫類
} |
- 多對多:學(xué)生與老師之間是多對多關(guān)系
class Student {//多方關(guān)聯(lián)多方
...
private List<Teacher> teachers; //在學(xué)生類中關(guān)聯(lián)教師類
}
class Teacher {//多方關(guān)聯(lián)多方
...
private List<Student> students; //在教師類中關(guān)聯(lián)學(xué)生類
} |
由以上的關(guān)系可以看出,關(guān)聯(lián)一方時(shí)成員就是一方對象,而關(guān)聯(lián)多方時(shí)成員就是多方對象的集合。
2.外鍵約束
概念模型在數(shù)據(jù)庫中就對應(yīng)數(shù)據(jù)表,那么表與表之間的關(guān)系也包括:一對一,一對多,多對多。而表與表之間關(guān)系是通過外鍵來維護(hù)的。
一個(gè)表的外鍵是另一個(gè)表或它本身的主鍵,如圖1-1所示:
圖1-1 emp表
在emp表中有兩個(gè)外鍵,分別是mgr、deptno,其中mgr代表的是員工的上級編碼,它引用的是emp表的主鍵empno,因?yàn)閱T工的上級也是員工,所以上級的編號一定是emp表的主鍵;而deptno是dept表即部門表的主鍵,由圖1-1可以發(fā)現(xiàn),emp表中deptno列的值有重復(fù)的,表明部門是一方,員工是多方。
外鍵約束特性如下:
- 外鍵必須是另一表或自身表的主鍵的值;
- 外鍵可以重復(fù);
- 外鍵可以為空;
- 一張表中可以有多個(gè)外鍵。
我們來查看一下部門表,如圖1-2所示:
圖1-2 dept表
圖1-2中,部門表的主鍵值包括:10、20、30、40,emp表中的deptno列的值引用了dept表的deptno列的值,而圖1-1中,emp表的最后一條記錄,名為張三的部門編號是50,這顯然不符合外鍵約束的要求,因?yàn)樵趀mp表中沒有設(shè)置外鍵約束因此才沒有報(bào)錯(cuò)。后面我們會(huì)學(xué)習(xí)如何設(shè)置外鍵約束。
外鍵值可以重復(fù),對于emp表來說,一個(gè)部門中有多個(gè)員工,那么emp表中一定有多個(gè)員工的deptno列的值是相同的。
外鍵值可以為null,emp表中的一條記錄還沒有與dept表建立關(guān)聯(lián)時(shí),該條記錄的外鍵值可以為null。
由以上可以發(fā)現(xiàn),在對象模型中,兩個(gè)實(shí)體的關(guān)聯(lián)是通過在各個(gè)實(shí)體中引用關(guān)聯(lián)實(shí)體對象體現(xiàn)的,而在數(shù)據(jù)庫表中表與表的關(guān)聯(lián)是通過一個(gè)字段關(guān)聯(lián)的。
如果表之間建立了關(guān)聯(lián)關(guān)系,會(huì)有如圖1-3所示的效果:
圖1-3 表與表的關(guān)系
圖1-3中,book表中的cid是外鍵,引用自category表中的cid主鍵;orderitem表中的bid是外鍵,引用自book表的主鍵bid,oid也是外鍵,引用的是orders表中的oid主鍵;orders表中的uid是外鍵,引用自user表中的主鍵uid。這些表與表之間的關(guān)系,就可以通過上圖很清楚的體現(xiàn)出來。
本文版權(quán)歸傳智播客Java培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:傳智播客Java培訓(xùn)學(xué)院
首發(fā):http://metathetuscanyresort.com/javaee