# PostgreSQL 正規化探討 Part2
## 前言
前文感謝大家的回應.其中Eric Tam大大有提到多名女優合演同一片的情境.
所以特別再補充本篇.
## 共演的情境
### array 的方式
若能夠使用array 裡面的元素都能夠使用references 就能夠很輕鬆的處理了.
可惜這方式,似乎只有討論試做,並未正式的支持.
### 其實之前的範例是簡化了
之前的範例中, videos 其實只是一個對應的video 與 contract 的中介table,video 相關的資訊會有另一個table 存放,而且是上一級.
這樣就能夠將共演片產生多筆在video中,分別對應每個共演女優與公司的contract.每筆對應單獨的video詳細資訊那一級.
## 實際的範例
以 DV-1368 為例,這是 小島みなみ 與 奧田咲 在 Alice Japan 的共演片.
```sql=
-- 新增 奧田咲 在 s1212a.gal
insert into s1212a.gal values
(5, '奧田咲');
-- 新增 奧田咲 與 Alice Japan 配對在 s1212a.contract
insert into s1212a.contract values
(8, 5, 1);
-- 新增 DV-1368 兩筆到 s1212a.videos
insert into s1212a.videos values
(12, 1, 'DV-1368'),(13, 8, 'DV-1368');
select *
  from s1212a.current_vidoes;
  
   gname    |    cname    |        vids         
------------+-------------+---------------------
 奧田咲     | Alice Japan | {DV-1368}
 葵つかさ   | Alice Japan | {DV-1195}
 葵つかさ   | S1          | {SNIS–436,SSIS-974}
 あやみ旬果 | PRESTIGE    | {EDD-209,ABP-356}
 あやみ旬果 | S1          | {SSNI-203}
 小島みなみ | Alice Japan | {DV-1279,DV-1368}
 小島みなみ | S1          | {SSIS-911,SNIS-133}
 鈴村あいり | PRESTIGE    | {EDD-218,ABF-061}
(8 rows)
```
### 增加刪除同樣番號的機制
若日本沒有AV新法,其實是不需要這樣補充的.
但是若是採取嚴格的方式,只要有一名女優提出下架,不管那女優演出占比多少,就強制下架.所以需要補充這樣的機制.
只要建立一個 after delete trigger 將相同番號的資料從 s1212a.videos 刪除,當然這樣刪除時,之前的另一個trigger也會發生作用,會將資料存到 s1212bak.videos 中.
來看實際操作吧.
```sql=
create or replace function s1212a.f_videos_ad_del()
returns trigger
language plpgsql as
$code$
begin
  delete 
    from s1212a.videos
   where vid = old.vid;
   
  return old;
end;
$code$;
create trigger tri_ad_videos
after delete on s1212a.videos
for each row execute function s1212a.f_videos_ad_del();
----
-- 假設 奧田咲 要求下架 Alice Japan 的影片
delete 
  from s1212a.contract c
 using s1212a.gal g
     , s1212a.company co
 where c.gal_id = g.id
   and c.com_id = co.id
   and g.gname = '奧田咲'
   and co.cname = 'Alice Japan';
   
-- 檢查 
select *
  from s1212a.current_vidoes;
   gname    |    cname    |        vids         
------------+-------------+---------------------
 葵つかさ   | Alice Japan | {DV-1195}
 葵つかさ   | S1          | {SNIS–436,SSIS-974}
 あやみ旬果 | PRESTIGE    | {ABP-356,EDD-209}
 あやみ旬果 | S1          | {SSNI-203}
 小島みなみ | Alice Japan | {DV-1279}
 小島みなみ | S1          | {SSIS-911,SNIS-133}
 鈴村あいり | PRESTIGE    | {EDD-218,ABF-061}
(7 rows)
select *
  from s1212bak.contract;
 id | gal_id | com_id 
----+--------+--------
  8 |      5 |      1
(1 row)
select *
  from s1212bak.videos;
 id | cid |   vid   
----+-----+---------
 13 |   8 | DV-1368
 12 |   1 | DV-1368
(2 rows)
rollback;
```
## 結語
正規化其實不好做,但是若能在實作的過程中不斷思考,研究.相信能夠發揮出其功能.
## 感謝
在此除了要感謝各位的回應,還要感謝 小島みなみ, 葵つかさ, あやみ旬果, 鈴村あいり 還有今天加入的 奧田咲.