在現實的資料庫應用中,資料儲存在多個相關聯的表中。基本上沒有資料只存在乙個表中的情況。小的應用系統一般也有十幾個表,大型系統一般有上千個表。
我們以學生成績查詢為例來講解表的關聯。除了student表,這裡我們需要新建成績表,表grade:
snocno
grade
s01c01
s01c04
s02c02
s03c02
s03c03
s04c02
s05c01
s05c03
s06c01
s06c03
s06c04
表3grade
表中的字段的含義分別為學號、課程號和成績。其中欄位sno和cno構成復合主鍵。
相對於單一表,將資料分散儲存在多個關聯的表中,不僅條理清楚,而且方便資料的管理和查詢。特別是存在多對多等複雜關係時,關聯表可以通過中間表等方法輕鬆實現,此時如果採用單一表,表的規模會很大且存在很多冗餘資訊,大大降低查詢效率。
假如使用單一表,則需要如下結構的表來儲存以上資料:
snosname
s***
sage
sdept
cnograde
s01王建平
男自動化
c01s01
王建平男
自動化c04
s02劉華女電子
c02s03
範林軍女
電子c02
s03範林軍女電子
c03s04李偉男
計算機c02
s05趙健男數學
c01s05趙健男
數學c03
s06黃玲女數學
c01s06黃玲女
數學c03
s06黃玲女數學
c04
可見表的結構非常複雜。這個表只是包含了學生的基本資訊和選課資訊,倘若將幾十上百個分立表中的資訊都包含在乙個表中,其複雜程度是不可想象的。隨著複雜程度的增加,對資料的操作(例如插入新資料)sql語句也會越來越複雜,這裡就不舉例子了。
另外,我們可以看到表中有很多冗餘的資料。黃玲乙個學生,其基本資訊在三條記錄中被重複儲存,這對系統儲存空間也是一種浪費。
正是由於上述原因,實際資料都是儲存在相互關聯的表中。那麼多個表是如何實現相互關聯的呢?
這裡我們新建此前已經提到的課程表,表course,課程號cno作為其主鍵:
cnocourse
credit
c01資料庫概論
c02c程式設計
c03高等數學
c04計算機網路
這樣在當前學生選課的例子中有三個表,學生表(sno,sname,s***,sage,sdept)、成績表(sno,cno,grade)、課程表(cno,course,credit)。其中成績表中的sno和cno欄位分別對應著學生表中的sno欄位和課程表中的cno欄位。也就是說,成績表sno欄位的每個值都可以在學生表sno字段值中找到,它們對應的是同乙個學生,學生表和成績表通過欄位sno相互關聯。同理,成績表和課程表通過欄位cno相互關聯。
定義外來鍵能夠體現表的關聯。如果表a的乙個欄位x不是a的主鍵,而是另乙個表b的主鍵,則這個欄位x稱為表a的外來鍵,表a為參照表,表b為被參照表。外來鍵約束主要是為了與另一張表進行關聯,以維護兩個表之間的一致性關係。表的外來鍵是另乙個表的主鍵,與主鍵不同的是,外鍵值可以有重複的,也可以是空的。在此例中,表grade中的字段sno即為外來鍵,在表student中欄位sno則是主鍵。這樣,表grade便通過外來鍵sno實現了與表student的關聯。
乙個表可以有多個外來鍵。正如上述例子中欄位cno也是表grade的外來鍵,表grade通過外來鍵cno與表course實現了關聯。
相對於單錶,多表關聯有諸多優點:
1. 結構關係靈活。每張表都可以反映不同方面的資訊,通過多張相互關聯的表,可以管理任意複雜的資料。
2. 操作快速,效率高。無論是單錶操作還是關聯操作,在相互關聯的多個表基礎上都可以簡單有效地實現。仍以學生選課為例,當需要修改表中的資料,例如插入乙個學生的成績,只需對錶grade作修改:
insert into grade (sno,cno,grade) values(「s04」,」c04」,62);
查詢姓名為劉華的學生的選課情況,需要關聯學生表和成績表,sql語句如下:
select student2.sname,grade.cno from student2 inner join grade on student.sno=grade.sno where student2.sname=」劉華」;
3. 節省儲存空間。由於每個表分別儲存不同方面的資訊,資料重複儲存的現象比較少。
4. 表間存在約束關係,避免出錯。例如登記學生成績時,成績表中的學號必須對應學生表中已有的學號,這種約束關係避免了插入錯誤的資訊。:
oracle insert兩個關聯表
現有一張老師學生表 tb tea cou 由於業務需要,需把老師學生表tb tea stu拆分成兩張表 tb tea tb cou 並把記錄insert到這兩張子表中 tb tea tb cou為關聯的兩張表 表結構如下 tb tea cou id,pk name,任課老師 zc,職稱 course...
oracle insert兩個關聯表
現有一張老師學生表 tb tea cou 由於業務需要,需把老師學生表tb tea stu拆分成兩張表 tb tea tb cou 並把記錄insert到這兩張子表中 tb tea tb cou為關聯的兩張表 表結構如下 tb tea cou id,pk name,任課老師 zc,職稱 course...
JPA如何實現兩個表的非主鍵列的關聯
問題描述表關係 sync 多 media 一 在用jpa做向專案的時候,一般兩張表關聯的時候都是拿id關聯的,所以在實體類中維護註解 manytoone的時候,在sync表一般是這樣寫的 manytoone joincolumn name sn private media media 這個註解就是吧...