過度正規化
回想一下 loan 資料表的定義。
CREATE TABLE loan (
borrower_id INTEGER REFERENCES borrower(id),
bank_id INTEGER REFERENCES bank(id),
approval_date DATE NOT NULL DEFAULT CURRENT_DATE,
gross_approval DECIMAL(9, 2) NOT NULL,
term_in_months SMALLINT NOT NULL,
revolver_status BOOLEAN NOT NULL DEFAULT FALSE,
initial_interest_rate DECIMAL(4, 2) NOT NULL
);
為了符合 1NF,有人提出了這個資料表的新設計。修訂後的定義以 approval_month、approval_day 和 approval_year 取代 approval_date:
CREATE TABLE loan (
...
approval_month SMALLINT,
approval_day SMALLINT,
approval_year SMALLINT,
...
);
這個練習要示範,為何過度正規化可能會讓無效資料被插入。
本練習屬於課程
建立 PostgreSQL 資料庫
練習說明
- 移除那段若執行就會把無效資料插入資料表的
INSERT INTO陳述式。
動手互動練習
試著完成這個範例程式碼,體驗一下這個練習。
INSERT INTO loan (
borrower_id, bank_id, approval_month, approval_day,
approval_year, gross_approval, term_in_months,
revolver_status, initial_interest_rate
) VALUES (12, 14, 12, 1, 2013, 421115, 120, false, 4.42);
INSERT INTO loan (
borrower_id, bank_id, approval_month, approval_day,
approval_year, gross_approval, term_in_months,
revolver_status, initial_interest_rate
) VALUES (3, 201, 6, 42, 2017, 30015, 60, true, 3.25);
INSERT INTO loan (
borrower_id, bank_id, approval_month, approval_day,
approval_year, gross_approval, term_in_months,
revolver_status, initial_interest_rate
) VALUES (19, 5, 8, 19, 2018, 200000, 120, false, 6.3);