作為數據庫的開發者,我們經常面臨著要找出及刪除數據庫中冗余數據的任務,如果數據庫中有大量的冗余數據(占總數的百分比太多),數據的精確性和可靠性將受到影響,同時也影響著數據庫的性能,那麼如何解決這個問題呢?下面我將探討關於這個問題的這個解決方案,Oracle也為我們提供了一個解決方案,但是Oracle提供的解決方案不夠完美,遇到大批量數據那個解決方案工作起來很慢
應該怎麼刪除冗余數據呢?
在這裡我們應用一個PL/SQl方案(一個自定義的存儲過程)或者一個SQL語句的解決方案(使用一個分析的函數RANK()和一個嵌套的子查詢)來消除冗余數據然後控制應該保留的記錄
什麼是冗余數據?
冗余數據就是一個數據表中,這個表中的行包含了一些相同的值,這些值理論上來說應該是唯一的(這些值一般來說能確定一條記錄)例如,像社會保險號,姓與名的集合.那麼我們把這麼含有相同信息的行中包含的數據叫做冗余數據,現在所有的數據庫表中都有主鍵約束,主鍵中記錄了一行記錄中的唯一值,從數據庫的角度來看,每一行都是唯一的,但是從我們用戶角度看來,這些記錄都是相同的記錄,因為它們都包含相同的鍵值(First Name + Last Name),即使他們有不同的主鍵
ID Last Name First Name City Phone
---- --------------- ---------- --------------- ----------
1005 KrIEger Jeff San Ramon 9252997100
1012 KrIEger Jeff San Ramon 9252997100
1017 KrIEger Jeff San Ramon 9252997100
那麼這些冗余數據是怎麼出現的那?通常有兩種情況:1.從不同的表中加載或者合並數據
通過圖形化的用戶接口來輸入數據,然後由計算機來生成一個唯一的鍵,並做為這一條記錄的主鍵
那麼怎樣找到冗余數據呢?讓我們來創建一個叫作Customer 的表並向其中加入冗余數據,看表1,正如你所看到的,我們並沒有在這個表上做什麼限制來防止冗余數據,下面這麼代碼創建了一個唯一約束,來防止冗余數據的生成
SQL
Listing 1. 創建Customer表
這個表中我們故意加入了冗余數據
DROP TABLE Customers CASCADE CONSTRAINTS;
CREATE TABLE Customers(
Id INTEGER NOT NULL,
LastName VARCHAR2(15) NOT NULL,
FirstName VARCHAR2(10),
Address VARCHAR2(20),
City VARCHAR2(15),
State CHAR(2),
Zip VARCHAR2(10),
Phone VARCHAR2(10),
RecDate DATE,
CONSTRAINT Customers_PK
PRIMARY KEY (ID))
TABLESPACE TALLYDATA;
INSERT INTO Customers
VALUES (1000, 'Bradley', 'Tom', '2450 3rd Str. #12',
'San Francisco', 'CA', '94114', '4156679230',
TO_DATE('01-JAN-2000', 'DD-MON-YYYY'));
INSERT INTO Customers
VALUES (1001, 'Stone', 'Tony', '12 Main St. Apt. 3',