嵌套表
一、嵌套表的定義:
嵌套表是表中之表。一個嵌套表是某些行的集合,它在主表中表示為其中的一列。對主表中的每一條記錄,嵌套表可以包含多個行。在某種意義上,它是在一個表中存儲一對多關(guān)系的一種方法?疾橐粋包含部門信息的表,在任何時間內(nèi)每個部門會有很多項目正在實施。在一個嚴格的關(guān)系模型中,將需要建立兩個獨立的表department和project。
嵌套表允許在department表中存放關(guān)于項目的信息。勿需執(zhí)行聯(lián)合操作,就可以通過department表直接訪問項目表中的記錄。這種不經(jīng)聯(lián)合而直接選擇數(shù)據(jù)的能力使得用戶對數(shù)據(jù)訪問更加容易。甚至在并沒有定義方法來訪問嵌套表的情況下,也能夠很清楚地把部門和項目中的數(shù)據(jù)聯(lián)系在一起。在嚴格的關(guān)系模型中,department和project兩個表的聯(lián)系需要通過外部關(guān)鍵字(外鍵)關(guān)系才能實現(xiàn) ,新疆軟件開發(fā)網(wǎng)
二、舉例說明嵌套表的使用:
假設(shè)有一個關(guān)于動物飼養(yǎng)員的表,希望其中具有他們飼養(yǎng)的動物的信息。用一個嵌套表,就可以在同一個表中存儲飼養(yǎng)員和其飼養(yǎng)的全部動物的信息。
1、創(chuàng)建類型animal_ty:此類型中,對于每個動物都包含有一個記錄,記載了其品種、名稱和出生日期信息。
CREATE TYPE animal_ty AS OBJECT (
breed varchar2(25),
name varchar2(25),
birthdate date);
2、創(chuàng)建animals_nt:此類型將用作一個嵌套表的基礎(chǔ)類型。
CREATE TYPE animals_nt as table of animal_ty;
3、創(chuàng)建表breeder:飼養(yǎng)員的信息表
create table breeder
(breedername varchar2(25),
animals animal_nt)
nested table animals store as animals_nt_tab;
4、向嵌套表中插入記錄
insert into breeder
values('mary',animal_nt(animal_ty('dog','butch','31-MAR-97'),
animal_ty('dog','rover','31-MAR-97'),
animal_ty('dog','julio','31-MAR-97')));
insert into breeder
values('jane',animal_nt(animal_ty('cat','an','31-MAR-97'),
animal_ty('cat','jame','31-MAR-97'),
animal_ty('cat','killer','31-MAR-97')));
commit;
5、查詢嵌套表
select name,birthdate from
table(select animals from breeder);
select name,birthdate from
table(select animals from breeder
where breedername=’mary’)
where name=’dog’;
三、嵌套表的特點:
1、對象復用:如果編寫面向?qū)ο蟮拇a,就提高了重用以前編寫的代碼模塊的機會。同樣,如果創(chuàng)建面向?qū)ο蟮臄?shù)據(jù)庫對象,也就提高了數(shù)據(jù)庫對象能夠被重用的機會。
2、標準支持:如果創(chuàng)建標準的對象,那么它們被重用的機會就會提高。如果有多個應用或多個表使用同一數(shù)據(jù)庫對象集合,那么它就是既成事實的數(shù)據(jù)庫對象標準。
3、定義訪問路徑:對于每一個對象,用戶可定義在其上運行的過程和函數(shù),從而可以使數(shù)據(jù)和訪問此數(shù)據(jù)的方法聯(lián)合起來。有了用這種方式定義的訪問路徑,就可以標準化數(shù)據(jù)訪問的方法并提高對象的可復用性。
可變數(shù)組
一、可變數(shù)組的定義:
可變數(shù)組與嵌套表相似,也是一種集合。一個可變數(shù)組是對象的一個集合,其中每個對象都具有相同的數(shù)據(jù)類型。可變數(shù)組的大小由創(chuàng)建時決定。在表中建立可變數(shù)組后,可變數(shù)組在主表中作為一個列對待。從概念上講,可變數(shù)組是一個限制了行集合的嵌套表。
可變數(shù)組,允許用戶在表中存儲重復的屬性。例如:假設(shè)用戶有一個project表,并在項目中指定了工作人員,一個項目可以有多個工人,而一個工人也可以為多個項目工作。在嚴格的關(guān)系模型中,用戶可以創(chuàng)建一個project表,一個worker表和存儲它們之間關(guān)系的交叉表project_worker。
用戶可使用可變數(shù)組在project表中存儲工人的名字。如果項目限定的工人數(shù)不超過10人,可以建立一個以10個數(shù)據(jù)項為限的可變數(shù)組。接下來就可處理此可變數(shù)組,從而對于每一個項目,可以選取其中所有工人的名字,而勿需查詢表worker。
二、舉例說明可變數(shù)組的使用:
1、創(chuàng)建類型comm_info
CREATE TYPE comm_info AS OBJECT ( /*此類型為通訊方式的集合
no number(3), /*通訊類型號
comm_type varchar2(20), /*通訊類型
comm_no varchar2(30)); /*號碼
2、創(chuàng)建可變數(shù)組comm_info_list
CREATE TYPE comm_info_list AS
VARRAY(50) OF comm_info;
3、創(chuàng)建表
create table user_info
(user_id number(6), /*用戶ID號
user_name varchar2(20), /*用戶名稱
user_comm comm_info_list); /*與用戶聯(lián)系的通訊方式
4、向可變數(shù)組插入記錄
insert into user_info
values(1,'mary',comm_info_list(comm_info(1,'手機','13651401919'),
comm_info(2,'呼機','1281234567')));
insert into user_info
values(2,'carl',comm_info_list(comm_info(1,'手機','13901018888'),
comm_info(2,'呼機','1281234567')));
commit;
5、查詢可變數(shù)組
select user_comm from user_info
where user_id=1;
select comm_type,comm_no
from table(select user_comm from user_info
where user_id=1)
where no=1;
與一位用戶聯(lián)系的方式有很多種,比如:手機、呼機、座機等。在一個嚴格的關(guān)系模型中,將需要兩個獨立的表:用戶信息和通訊方式,而在可變數(shù)組中,允許在表user_info中直接訪問用戶的聯(lián)系方式,這種不經(jīng)聯(lián)合而直接選擇數(shù)據(jù)的能力使得用戶對數(shù)據(jù)的訪問更加容易。
三、可變數(shù)組的特點:
1、對象復用:如果編寫面向?qū)ο蟮拇a,就提高了重用以前編寫的代碼模塊的機會。同樣,如果創(chuàng)建面向?qū)ο蟮臄?shù)據(jù)庫對象,也就提高了數(shù)據(jù)庫對象能夠被重用的機會。
2、標準支持:如果創(chuàng)建標準的對象,那么它們被重用的機會就會提高。如果有多個應用或多個表使用同一數(shù)據(jù)庫對象集合,那么它就是既成事實的數(shù)據(jù)庫對象標準。
3定義訪問路徑:對于每一個對象,用戶可定義在其上運行的過程和函數(shù),從而可以使數(shù)據(jù)和訪問此數(shù)據(jù)的方法聯(lián)合起來。有了用這種方式定義的訪問路徑,就可以標準化數(shù)據(jù)訪問的方法并提高對象的可復用性。
|