[Day13] Oracle13 [10/14]

 

λ¦΄λ ˆμ΄μ…˜ =  ν…Œμ΄λΈ”
νŠœν”Œ        =  λ ˆμ½”λ“œ(ν–‰)
속성        =  컬럼


μ •κ·œν™”

- μ΄μƒν˜„μƒ(μ‚½μž…,κ°±μ‹ ,μ‚­μ œ), ν•¨μˆ˜ 쒅속성 (  X->Y ), 1NF~ 5NF
- ERD->κ΄€κ³„μŠ€ν‚€λ§ˆ 생성 ν›„  μ’…속성 이둠을 μ΄μš©ν•΄μ„œ 잘λͺ»λœ μ„€κ³„λœ 관계 μŠ€ν‚€λ§ˆλ₯Ό 더 μž‘μ€ μ†μ„±μ˜ λ°”λžŒμ§ν•œ μŠ€ν‚€λ§ˆλ‘œ λ§Œλ“€μ–΄ κ°€λŠ” 과정을 μ •κ·œν™” 라고 ν•œλ‹€.
- DB 섀계 문제점(  λ°μ΄ν„° 쀑볡 )이 μžˆμ„ 경우 μ‚½μž…,κ°±μ‹ ,μ‚­μ œν•  λ•Œ λ¬Έμ œκ°€ λ°œμƒν•˜λŠ” 것을 "μ΄μƒν˜„μƒ"이라고 ν•œλ‹€. μ΄λŸ° μ΄μƒν˜„μƒμ„ μ œκ±°ν•˜λŠ” 것을 μ •κ·œν™”λΌκ³  ν•œλ‹€.

 

데이터 쀑볡 제거 κ³Όμ •(μž‘μ—…) == μ •κ·œν™”   
 

ν•¨μˆ˜μ  쒅속성(FD;Functional Dependency) 

- μ •κ·œν™” ν…Œμ΄λΈ”μ˜  μ†μ„±λ“€κ°„μ˜ κ΄€λ ¨μ„±

DEPT(λΆ€μ„œν…Œμ΄λΈ”)
PK

κ²°μ •μž         μ’…μ†μž 
  X                   Y 
[deptno]    dname                   loc    
10               ACCOUNTING      NEW YORK
20              RESEARCH            DALLAS
30              SALES                    CHICAGO
40              OPERATIONS        BOSTON

* Y μ†μ„±μ€ X μ†μ„±μ— ν•¨μˆ˜μ  μ’…속적이닀.
* X -> Y

1) μ™„μ „ ν•¨μˆ˜μ  쒅속 
- μ–΄λ–€ λ¦΄λ ˆμ΄μ…˜ Rμ—μ„œ 속성Aκ°€ 속성 집합일 λ•Œ, 속성 Bκ°€ 속성A에 ν•¨μˆ˜μ  μ’…μ†ν•˜λ©΄μ„œ, 속성 A의 μ–΄λ–€ μ§„λΆ€λΆ„ μ§‘합에도 ν•¨μˆ˜μ μœΌλ‘œ μ’…μ†ν•˜μ§€ μ•ŠμœΌλ©°, μ†μ„± Bκ°€ μ†μ„± A에 μ™„μ „ν•˜κ²Œ ν•¨μˆ˜μ μœΌλ‘œ μ’…μ†ν•œλ‹€.
- μ—¬λŸ¬ 개의 속성이 λͺ¨μ—¬μ„œ ν•˜λ‚˜μ˜ κΈ°λ³Έν‚€λ₯Ό 이룰 경우 ( 볡합킀 ) 볡합킀 전체에 μ–΄λ–€ 속성이 쒅속적일 λ•Œ "μ™„μ „ ν•¨μˆ˜μ  쒅속"이라 ν•œλ‹€. 

볡합킀
[고객ID]        [이벀트ID]      A    B   C
kenik            E001              
[ X         +       Y ]      ->     A
[ X         +       Y ]      ->     B
[ X         +       Y ]      ->     C


 2) λΆ€λΆ„ ν•¨μˆ˜μ  μ’…속
- μ™„μ „ ν•¨μˆ˜μ  쒅속이 μ•„λ‹ˆλ©΄ λΆ€λΆ„ ν•¨μˆ˜μ  쒅속이닀. 

   λ³΅ν•©ν‚€
   [고객ID]      [이벀트ID]   ν•©κ²©μ—¬λΆ€    λ“±κΈ‰
   kenik             E001           Y           gold
              볡합킀      ->     ν•©κ²©μ—¬λΆ€ O
              볡합킀      ->                        λ“±κΈ‰ X
   κ³ κ°ID  -> λ“±κΈ‰   O


 3) μ΄ν–‰ ν•¨μˆ˜μ  μ’…속
     X->Y,   Y->Z  
    κ²°μ •μž

    dept ν…Œμ΄λΈ”
    κ²°μ •μž
    PK
       X      ->                   Y           
                                       Y     ->      Z
    [deptno]                dname       λΆ€μ„œμž₯    λΆ€μ„œμž₯성별
    λΆ€μ„œλ²ˆν˜Έ                  λΆ€μ„œλͺ…         ν™κΈΈλ™    λ‚¨μž


 -- μ •κ·œν™” --    
원뢀이결닀쑰 

1 : μ›μžκ°’이 μ•„λ‹Œ λ„메인 λΆ„ν•΄
2 : λΆ€λΆ„ν•¨μˆ˜ μ’…속성 μ œκ±°
3 : μ΄ν–‰ν•¨μˆ˜ μ’…속성 μ œκ±°
4 : κ²°μ •μžμ΄λ©΄μ„œ ν›„보킀 μ•„λ‹Œ κ²ƒ μ œκ³ 
5 : λ‹€μΉ˜μ’…속 μ œκ±°
6 : μ‘°μΈ μ’…속성 μ΄μš©


1) 제1μ •κ·œν™”( NOrmal Form )  1NF
- λ¦΄λ ˆμ΄μ…˜μ— μ†ν•œ λͺ¨λ“  μ†μ„±μ˜ 도메인이 μ›μž κ°’(atomic value)으둜만 κ΅¬μ„±λ˜μ–΄ 있으면 제1μ •κ·œν˜•μ— μ†ν•œλ‹€.

 deptno dname    loc
 10         μ΄λ¬΄λΆ€       l_id(FK) 1
 20         μ˜μ—…λΆ€                     2
 30        생산뢀                      1
 40        μžμž¬λΆ€                      2
 :
 
 [λΆ€μ„œμ§€μ—­ ν…Œμ΄λΈ”]
 PK
 l_id
 1    μ„œμšΈ   ... ...
 2    λΆ€μ‚°
 3    λŒ€κ΅¬


2) 제2μ •κ·œν™”  (2NF)
- λ¦΄λ ˆμ΄μ…˜μ΄ 제1μ •κ·œν˜•μ— μ†ν•˜κ³ , κΈ°λ³Έν‚€κ°€ μ•„λ‹Œ λͺ¨λ“  속성이 기본킀에 μ™„μ „ ν•¨μˆ˜ μ’…μ†λ˜λ©΄ 제2μ •κ·œν˜•μ— μ†ν•œλ‹€.  
- λΆ€λΆ„ ν•¨μˆ˜μ  쒅속 -> 제거

          볡합킀  
 [고객ID + 이벀트ID ]  λ‹Ήμ²¨μ—¬λΆ€   κ³ κ°λͺ…  κ³ κ°λ“±κΈ‰

->

 μ΄λ²€νŠΈ ν…Œμ΄λΈ”
  E001           λ…ΈνŠΈλΆ        30%     μ‹œμž‘일    μ’…λ£ŒμΌ ...
  E002           λ…ΈνŠΈλΆ        20%
  E003           ν°              50%
  E001           λ…ΈνŠΈλΆ        30%
  μ΄λ²€νŠΈ <μ‹ μ²­>       
  μ‹ μ²­λ²ˆν˜Έ(PK)     κ³ κ°ID    이벀트ID   μ‹ μ²­μΌ      λ‹Ήμ²¨μ—¬λΆ€
  1                        고객1      E001        22.1.1        Y
  κ³ κ°ν…Œμ΄λΈ”
  κ³ κ°ID         κ³ κ°λͺ…      고객등급
  고객1


3)제3μ •κ·œν™”( 3NF )
- λ¦΄λ ˆμ΄μ…˜μ΄ 제2μ •κ·œν˜•μ— μ†ν•˜κ³ , κΈ°λ³Έν‚€κ°€ μ•„λ‹Œ λͺ¨λ“  속성이 기본킀에 [이행적 ν•¨μˆ˜ 쒅속]이 λ˜μ§€ μ•ŠμœΌλ©΄ 제3μ •κ·œν˜•μ— μ†ν•œλ‹€.
- 이행적 ν•¨μˆ˜ 쒅속 -> 제거

    PK
    X       ->    Y
    X       ->                     Z
                      Y             ->                 T
  deptno     λΆ€μ„œμž₯      λΆ€μ„œλͺ…       λΆ€μ„œμž₯μ—°λ½μ²˜
  
   X->Y,    Y->Z

->

   λΆ€μ„œν…Œμ΄λΈ” 
   λΆ€μ„œλ²ˆν˜Έ  λΆ€μ„œμž₯μ‚¬μ›μ½”λ“œ(FK)  λΆ€μ„œλͺ…
   μ‚¬μ›ν…Œμ΄λΈ”
   μ‚¬μ›μ½”λ“œ(PK) 사원λͺ… 직급λͺ… μ—°λ½μ²˜



  4) λ³΄μ΄μŠ€/μ½”λ“œ μ •κ·œν™”( BCNF ) 
    λ¦΄λ ˆμ΄μ…˜μ˜ ν•¨μˆ˜ μ’…속 κ΄€κ³„μ—μ„œ λͺ¨λ“  κ²°μ •μž(볡합킀)κ°€ ν›„보킀이면 λ³΄μ΄μŠ€/μ½”λ“œ μ •κ·œν˜•μ— μ†ν•œλ‹€.
          λ³΅ν•©ν‚€

    [고객아이디  μΈν„°λ„·κ°•μ’Œ]       λ‹΄λ‹Ήκ°•μ‚¬λ²ˆν˜Έ
      [  X                 Y   ]       ->           Z            μ™„μ „ ν•¨μˆ˜ 쒅속
                             Y           <-           Z

           ν…Œμ΄λΈ”    [ X  Z ]      
           ν…Œμ΄λΈ”    [Z]    Y

           
* 제3μ •κ·œν™”λ₯Ό λ§Œμ‘±ν•˜λ©΄ BCNF μ •κ·œν™” 거의 μ—†λ‹€.  X   



* 물리적 dB λͺ¨λΈλ§
  - μ—­μ •κ·œν™” - μ„±λŠ₯
* EXERD  DB λͺ¨λΈλ§  -> 였라클 DB μ„œλ²„ ( μŠ€ν‚€λ§ˆ 생성 )
* μ—‘μ…€, λ©”λͺ¨μž₯              ->  INSERT μžλ™



λ·°( View ) 


1. ν…Œμ΄λΈ”을 λ³΄κΈ° μœ„ν•œ μ°½λ¬Έ μ •λ„λ‘œ μƒκ°.
2. κ°€μƒν…Œμ΄λΈ” =  1개 μ΄μƒμ˜ ν…Œμ΄λΈ” λ˜λŠ” λ·°λ₯Ό μ΄μš©ν•΄μ„œ μƒμ„±λœλ‹€.
3. λ·°λŠ” "데이터 μ‚¬μ „"에 μ •μ˜ λΆ€λΆ„λ§Œ μ €μž₯되고 , μ‹€μ œ λ°μ΄ν„°λŠ” μ €μž₯ X
4. λ·°λ₯Ό μ‚¬μš©ν•˜λŠ” λͺ©μ (이유 )
   1) λ³΄μ•ˆ
   2) νŽΈλ¦¬μ„±
5. λ·° - SELECT, INSERT, UPDATE, DELETE κ°€λŠ₯
6. μ œμ•½ 쑰건 μ„€μ • κ°€λŠ₯
7.  user_views :   λ·° μ‘°νšŒ.
    user_tables :   ν…Œμ΄λΈ” 정보 쑰회

SELECT *
FROM user_views;


8. λ·° μ’…λ₯˜
  1) λ‹¨μˆœλ·° (  simple view ) - 1 κ°œ
  2) λ³΅ν•©λ·° ( complex view ) - 2개 μ΄μƒ.~
9. λ·° μƒμ„± ν˜•μ‹ 
γ€ν˜•μ‹γ€‘
CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW λ·°μ΄λ¦„
[(alias[,alias]...]
AS subquery
[WITH CHECK OPTION]
[WITH READ ONLY];

OR REPLACE  : κ°™μ€ μ΄λ¦„μ˜ λ·°κ°€ μžˆμ„ κ²½μš° λ¬΄μ‹œν•˜κ³  λ‹€μ‹œ μƒμ„± 
FORCE             : κΈ°λ³Έ ν…Œμ΄λΈ”μ˜ μœ λ¬΄μ— 상관없이 λ·°λ₯Ό 생성 
NOFORCE       : κΈ°λ³Έ ν…Œμ΄λΈ”μ΄ μžˆμ„ λ•Œλ§Œ      λ·°λ₯Ό 생성 


ALIAS               : κΈ°λ³Έ ν…Œμ΄λΈ”μ˜ μ»¬λŸΌμ΄λ¦„κ³Ό λ‹€λ₯΄κ²Œ μ§€μ •ν•œ 뷰의 컬럼λͺ… λΆ€μ—¬ 


WITH CHECK OPTION  : 뷰에 μ˜ν•΄ access될 수 μžˆλŠ” ν–‰(row)만이 μ‚½μž…, μˆ˜μ • κ°€λŠ₯ 
WITH READ ONLY         :  DML μž‘μ—…μ„ μ œν•œ(단지 μ½λŠ” κ²ƒλ§Œ κ°€λŠ₯) 


예) νŒλ§€λŸ‰ 확인 - 쿼리 
 

SELECT b.b_id, title, price, g.g_id, g_name, p_date, p_su  
FROM book b JOIN danga  d ON b.b_id = d.b_id
            JOIN panmai p ON  b.b_id = p.b_id
            JOIN gogaek g ON  p.g_id = g.g_id;


-- λ·° μƒμ„±

GRANT CREATE VIEW TO scott;
CREATE OR REPLACE FORCE VIEW panView
( bookid, booktitle, bookprice, gogaekid, gogaekname, pdate, psu )
AS (

SELECT b.b_id , title, price, g.g_id, g_name, p_date, p_su  
FROM book b JOIN danga  d ON b.b_id = d.b_id
            JOIN panmai p ON  b.b_id = p.b_id
            JOIN gogaek g ON  p.g_id = g.g_id
);


-- λ·°λ₯Ό μ‚¬μš©ν•΄μ„œ μ „체 νŒλ§€ κΈˆμ•‘

SELECT SUM( psu * BOOKPRICE ) μ „μ²΄νŒλ§€κΈˆμ•‘
FROM panview;


-- λ·° μƒμ„± : gogaekview
-- λ…„도, μ›”, κ³ κ°μ½”λ“œ, κ³ κ°λͺ…, νŒλ§€κΈˆμ•‘총합 (  λ…„도별 μ›”별 )  μ‘°νšŒ

-- panmai :  p_date (  year, month ) , p_su
-- gogaek :  g_id, gname
-- danga  :                             price

-- ORA-00979: not a GROUP BY expression
-- ORA-00907: missing right parenthesis

CREATE OR REPLACE FORCE VIEW gogaekview 
  -- [alias,,,,]
AS 
        SELECT
              -- p_date
              TO_CHAR( p_date, 'YYYY')   year
              , TO_CHAR( p_date, 'MM')   month
              , g.g_id, g_name
              ,  SUM(  p_su * price ) amt
        FROM panmai p  JOIN gogaek g ON p.g_id = g.g_id
                       JOIN danga d  ON d.b_id = p.b_id
        GROUP BY    TO_CHAR( p_date, 'YYYY') 
              , TO_CHAR( p_date, 'MM'), g.g_id, g_name    
        ORDER BY   year
              , month



-- λ·°λ₯Ό μ‚¬μš©ν•΄μ„œ DML μž‘μ—… --

CREATE TABLE tbl_view1(
  aid   number primary key
  , name varchar2(20) not null
  , tel varchar2(20) not null
  , memo varchar2(100)
)
-- Table TBL_VIEW1이(κ°€) μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
CREATE TABLE tbl_view2(
  bid number primary key
  , aid number CONSTRAINT FK_tblview2_aid
         REFERENCES tbl_view1(aid) ON DELETE CASCADE -- FK
  , score number(3)
)

INSERT INTO tbl_view1 (aid, NAME, tel) VALUES (1, 'a', '1');
INSERT INTO tbl_view1 (aid, name, tel) VALUES (2, 'b', '2');
INSERT INTO tbl_view1 (aid, name, tel) VALUES (3, 'c', '3');
INSERT INTO tbl_view1 (aid, name, tel) VALUES (4, 'd', '4');

INSERT INTO tbl_view2 (bid, aid, score) VALUES (1, 1, 80);
INSERT INTO tbl_view2 (bid, aid, score) VALUES (2, 2, 70);
INSERT INTO tbl_view2 (bid, aid, score) VALUES (3, 3, 90);
INSERT INTO tbl_view2 (bid, aid, score) VALUES (4, 4, 100);

 COMMIT;



-- λ‹¨μˆœλ·° : 1개 ν…Œμ΄λΈ”

CREATE OR REPLACE VIEW aView
AS
  -- SELECT aid, name, memo  -- , tel varchar2(20) not null  X
  SELECT aid, name,tel
  FROM tbl_view1;



-- λ·°λ₯Ό μ‚¬μš©ν•΄μ„œ DML μž‘μ—…

INSERT INTO AVIEW (aid, name, memo ) VALUES ( 5, 'f', null );

-- ORA-01400: cannot insert NULL into ("SCOTT"."TBL_VIEW1"."TEL")
-- μ™œ? -> tbl_view1의 NOT NULL 쑰건이 적용되기 λ•Œλ¬Έμ—

INSERT INTO AVIEW (aid, name, tel ) VALUES ( 5, 'f', '5' );

 

--λ·° : 1 ν–‰ μ΄(κ°€) μ‚½μž…λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

-- λ‹¨μˆœλ·°
-- λ³΅ν•©λ·°

CREATE OR REplace VIEW abview
AS
SELECT a.aid, name, tel, bid, score
FROM tbl_view1 a JOIN tbl_view2 b ON a.aid = b.aid
WITH READ ONLY; -- SELECT 쑰회만 ν•˜κ² λ‹€,         I/U/D X  읽기 μ „μš©
-- View ABVIEW이(κ°€) μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
SELECT *
FROM abview;



-- λ·° μ‚­μ œ
DROP TABLE

DROP VIEW aview;
DROP VIEW abview;
-- View ABVIEW이(κ°€) μ‚­μ œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.



[ WITH CHECK OPTION ]
- 뷰에 μ˜ν•΄ access될 수 μžˆλŠ” ν–‰(row)만이 μ‚½μž…, μˆ˜μ • κ°€λŠ₯ 

SELECT *
FROM tbl_view2;
bid aid score
1     1      80
2    2      70
3    3      90
4    4    100
CREATE OR REPLACE VIEW bview
AS
  SELECT bid, aid, score
  FROM tbl_view2
  WHERE score >= 90;
UPDATE bview
SET   score = 70
WHErE bid = 3;


VS

 

CREATE OR REPLACE VIEW bview
AS
  SELECT bid, aid, score
  FROM tbl_view2
  WHERE score >= 90
  WITH CHECK OPTION  CONSTRAINT CK_BVIEW;
UPDATE bview
--SET   score = 70  -- UPDATE X
SET   score = 170  -- UPDATE O
WHERE bid = 3; -- 90

 

 -- ORA-01402: view WITH CHECK OPTION where-clause violation

INSERT INTO bview ( bid, aid, score) VALUES ( 5, 4, 10);

 

-- ORA-01402: view WITH CHECK OPTION where-clause violation

INSERT INTO bview ( bid, aid, score) VALUES ( 5, 4, 110);

 

--1 ν–‰ μ΄(κ°€) μ‚½μž…λ˜μ—ˆμŠ΅λ‹ˆλ‹€.


λ·° μ‚¬μš©μ΄μœ  ? 
-- μžμ£Ό μ‚¬μš©λ˜λŠ” κΈ΄ μΏΌλ¦¬( SELECT ) -> λ·° μƒμ„± , λ³΄μ•ˆ, νŽΈλ¦¬μ„±



[μ‹œν€€μŠ€ SEQUENCE ]

SELECT *
FROM dept;
                        deptno λΆ€μ„œλ²ˆν˜Έ μžλ™ μ„€μ •..
INSERT INTO dept VALUES ( 50,  OPERATIONS BOSTON );
INSERT INTO dept VALUES ( 60,  OPERATIONS BOSTON );
INSERT INTO dept VALUES ( 70,  OPERATIONS BOSTON );
ex) 은행 업무 처리 
제일 λ¨Όμ € ν•΄μ•Ό λ  μΌ ? μˆœμ„œ   -   λ²ˆν˜Έν‘œ λ½‘μ•„μš”.
 μ‹œν€€μŠ€ == [은행 λ²ˆν˜Έ μž₯치] μ²­μ›κ²½μ°°  10갯수
->  chache / μΊμ‹œκΈ°λŠ₯ (μ„±λŠ₯ 높일 수 있음)


 γ€ν˜•μ‹γ€‘
CREATE SEQUENCE μ‹œν€€μŠ€λͺ…
[ INCREMENT BY μ •μˆ˜]      1
[ START WITH μ •μˆ˜]        1
[ MAXVALUE n ¦ NOMAXVALUE]  100
[ MINVALUE n ¦ NOMINVALUE]  5
[ CYCLE ¦ NOCYCLE]
[ CACHE n ¦ NOCACHE];            

 

-- μ‹œν€€μŠ€
CREATE SEQUENCE seq_dept
INCREMENT BY 10
START WITH 50
MAXVALUE 90
NOCYCLE
NOCACHE;
-- Sequence SEQ_DEPT이(κ°€) μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

INSERT INTO dept VALUES ( seq_dept.nextval ,  'QC',  'SEOUL' );

SELECT seq_dept.currval
From dual;

INSERT INTO dept VALUES ( seq_dept.nextval ,  'XX',  'SEOUL' );
COMMIT;
CREATE SEQUENCE
ALTER SEQUENCE
DROP  SEQUENCE seq_dept;
  • 넀이버 λΈ”λŸ¬κ·Έ κ³΅μœ ν•˜κΈ°
  • 넀이버 λ°΄λ“œμ— κ³΅μœ ν•˜κΈ°
  • 페이슀뢁 κ³΅μœ ν•˜κΈ°
  • μΉ΄μΉ΄μ˜€μŠ€ν† λ¦¬ κ³΅μœ ν•˜κΈ°