摘 要: 范式是關(guān)系數(shù)據(jù)庫設(shè)計的理論基礎(chǔ),,也是設(shè)計數(shù)據(jù)庫中所要遵循的規(guī)則和指導(dǎo)方法,。但在實際情況中,,經(jīng)常出現(xiàn)某條記錄中某個值必須是集合類型,通常情況會建立新表,,然后再通過關(guān)系來實現(xiàn)多值的保存,。但連接查詢會嚴重影響數(shù)據(jù)庫性能。Oracle數(shù)據(jù)庫中通過內(nèi)嵌表實現(xiàn)了不符合第一范式的數(shù)據(jù)庫設(shè)計,,詳細研究了Oracle中內(nèi)嵌表的創(chuàng)建,、查詢以及修改的過程。
關(guān)鍵詞: Oracle,;內(nèi)嵌表,;范式
在關(guān)系數(shù)據(jù)庫中,存在以下定義:“在任何一個關(guān)系數(shù)據(jù)庫中,,第一范式1NF(1 Normal Form)是對關(guān)系模式的基本要求,,不滿足第一范式的數(shù)據(jù)庫就不是關(guān)系數(shù)據(jù)庫”[1]。
第一范式是指數(shù)據(jù)庫表的每一列都是不可分割的基本數(shù)據(jù)項,,同一列中不能有多個值,,即實體中的某個屬性不能有多個值或者不能有重復(fù)的屬性。如果出現(xiàn)重復(fù)的屬性,,就可能需要定義一個新的實體,,新的實體由重復(fù)的屬性構(gòu)成,新實體與原實體之間為一對多關(guān)系,。在第一范式中表的每一行只包含一個實例的信息,。例如,對于員工信息表,,不能將員工信息都放在一列中顯示,,也不能將其中的兩列或多列在一列中顯示;員工信息表的每一行只表示一個員工的信息,,一個員工的信息在表中只出現(xiàn)一次,。簡而言之,,第一范式就是無重復(fù)的列。
實際情況中,,卻常常出現(xiàn)某條記錄中某個值必須是集合類型(多值),,通常情況會通過新建一張新表,然后再通過關(guān)系(一對一,,一對多,,多對多)來實現(xiàn)多值的保存。但是,,這樣也同樣存在一個問題:查詢速度會變慢,。由于涉及不同的兩個表,查詢時就會涉及連接(JOIN)操作,,連接操作是最為耗費資源(時間,,空間)的操作,當(dāng)查詢量一旦增加超過某個閾值,,數(shù)據(jù)庫就可能會因為資源被耗盡而拒絕服務(wù),。為了減少連接操作的次數(shù),Oracle有一種這樣的特性,,可以將某一列的類型設(shè)置為一個集合類型(數(shù)組—VARRAY,,內(nèi)嵌表—Nested Table),這樣就可以在一個單元格中存放多個結(jié)構(gòu)相同的數(shù)據(jù)[2-5],。
在使用內(nèi)嵌表的時候,,需要先建立一個數(shù)據(jù)類型(Type),然后設(shè)置對應(yīng)列的類型為之前新建的類型,。建立完成后,,則對應(yīng)列的數(shù)據(jù)會變?yōu)楸眍愋停瑢ζ洳僮餍枰褂胻able函數(shù)將其轉(zhuǎn)為表后才可操作,。具體實現(xiàn)過程如下文所述,。
1 創(chuàng)建內(nèi)嵌表類型
(1)簡單類型內(nèi)嵌表,,這樣會創(chuàng)建出一個有且只有一列的內(nèi)嵌表(可看作數(shù)組)
create or replace
TYPE
TP_ENC_TBL
AS
TABLE OF NUMBER
(2)復(fù)雜類型內(nèi)嵌表
①創(chuàng)建表結(jié)構(gòu)
create or replace
TYPE
TP_ENC_TYP
AS
OBJECT(
SN VARCHAR2(32),,
C VARCHAR2(512),
N VARCHAR2(512)
)
?、趧?chuàng)建表類型
create or replace
TYPE
TP_ENC_TBL
AS
TABLE OF T_ENC_TYP
2 創(chuàng)建一個表,,其中COL列為內(nèi)嵌表類型
CREATE TABLE
T_NESTED_TABLE(
ID INTEGER PRIMARY KEY,
COL TP_ENC_TBL DEFAULT TP_ENC_TBL()
)
NESTED TABLE
COL
STORE AS
NT_COL
RETURN AS VALUE,;
3 查看T_NESTED_TABLE表
desc t_nested_table
名稱 空值 類型
ID NOT NULL NUMBER(38)
COL T_ENC_TBL()
可以看出,列的類型已經(jīng)是一個復(fù)雜的類型TP_ENC_TBL,,至此,,內(nèi)嵌表新建成功,。
4 對內(nèi)嵌表的操作
4.1 向內(nèi)嵌表列增加數(shù)據(jù)
INSERT INTO
TABLE(SELECT nt.col FROM t_nested_table nt WHERE nt.ID=1)
VALUES
(′val′,,′val′,,′val′)
首先必須選擇向內(nèi)嵌表插入數(shù)據(jù),由于表是內(nèi)嵌的,,所以必須先從某個單元格中將內(nèi)嵌表選擇出來,,然后使用table函數(shù)進行轉(zhuǎn)換,。
4.2 修改內(nèi)嵌表中的數(shù)據(jù)
UPDATE
TABLE(SELECT nt.col FROM t_nested_table nt WHERE nt.ID=1)t
SET
t.sn=′new_val′,,
t.c=′new_val′,,
t.n=′new_val′
首先必須選擇需要修改的內(nèi)嵌表,,由于表是內(nèi)嵌的,所以必須先從某個單元格中將內(nèi)嵌表選擇出來,,然后使用table函數(shù)進行轉(zhuǎn)換,。
4.3 查詢內(nèi)嵌表中的數(shù)據(jù)
SELECT
t.*
FROM
TABLE(SELECT nt.col FROM t_nested_table nt WHERE nt.ID=1)t
SN C N
new_val new_val new_val
4.4 刪除內(nèi)嵌表中的數(shù)據(jù)
DELETE FROM
TABLE(SELECT nt.col FROM t_nested_table nt WHERE nt.ID=1)t
WHERE
t.SN=′new_val′
嵌套表是表中之表,。一個嵌套表是某些行的集合,它在主表中表示為其中的一列,。對主表中的每一條記錄,嵌套表可以包含多個行,。在某種意義上,它是在一個表中存儲一對多關(guān)系的一種方法,。通過嵌套表,,在不影響數(shù)據(jù)庫性能的情況下,,通過Oracle實現(xiàn)不遵循范式的存儲,。
參考文獻
[1] 王珊,薩師煊.數(shù)據(jù)庫系統(tǒng)概論.第四版[M].北京:高等教育出版社,,2006.
[2] THOMAS KYTE(美).Oracle高級專家編程[M].美國加州:Wrox Press,,2001.
[3] 吳孝麗,周焱,,耿驚濤.ORACLE數(shù)據(jù)庫安全策略和方法[J].煤炭技術(shù),,2011,30(5):113-115.
[4] 俞盤祥.Oracle數(shù)據(jù)庫系統(tǒng)基礎(chǔ)[M].北京:清華大學(xué)出版社,,1995.
[5] 余以勝.Oracle數(shù)據(jù)庫備份解決方案的研究[J].計算機與數(shù)字工程,2006,,34(1):118-121.