[DB] 제약조건, 뷰

jhkim·2023년 4월 23일
0

데이터의 무결성: 데이터에 결함이 없는 것 - 중복되면 안되는 데이터가 중복되는 등의 결함이 없음

제약조건

제약조건 종류

PK, FK, UNIQUE, CHECK, DEFAULT, NULL허용 등

외래 키 제약 조건

외래 키가 있는 열은 무조건 다른 테이블의 기본 키와 연결된다.
기본 키가 있는 테이블이 기준 테이블이고, 외래 키가 있는 테이블이 참조 테이블이다.

기준 테이블은 회원,참조 테이블은 구매 테이블이다.

이 때 fk의 값은 반드시 기준 테이블(회원 테이블)에 pk로 존재해야 한다.
외래키 제약조건은 한 테이블의 열(컬럼)이 다른 테이블의 기본키(Primary Key)를 참조하도록 제한하는 이것이 바로 외래키 제약조건이다.
이 때 참조 테이블이 참조하는 기준 테이블의 열은 반드시 PK나 UNIQUE로 된 열이어야 한다.

그럼 기준 테이블의 열을 변경하거나 삭제하면?

참조된 열의 데이터는 변경이나 삭제가 불가능하다. 데이터의 일관성 문제 때문이다.
하지만 ON UPDATE CASCADE나, ON DELETE CASCADE를 설정해두면 괜찮다.
이러면 기준 테이블의 데이터가 삭제/변경되면 참조 테이블의 데이터도 삭제/변경된다.

고유 키 제약 조건

고유키와 pk의 공통점은 unique하다는 것, 차이점은 null허용 여부이다.
고유키는 허용하지만 pk는 허용하지 않는다.
또한 pk는 유일해야 하지만, 고유키는 테이블 내에 여러 개여도 무방하다.

체크 제약조건

평균 키에 마이너스 값이 입력되지 않도록 하거나, 전화번호 앞자리가 유효하도록 제약을 거는 등 조건

ALTER TABLE member
ADD CONSTRAINT chk_phone_number
CHECK (phone LIKE '02%' OR phone LIKE '031%' OR phone LIKE '032%' OR phone LIKE '010%');

이런 식으로 제약 조건을 걸 수 있다.

기본값 정의

값을 입력하지 않았을 때 자동으로 디폴트값을 넣을 수 있다.

    @Column(nullable = false, columnDefinition = "INT DEFAULT 0")
    private int age;

jpa에서는 어노테이션으로 위와 같이 설정할 수 있다.

널값 허용

생략하면 NULL이 허용되고, NOT NULL하면 NULL을 허용하지 않는다.
이 때 PK로 설정된 열은 자동으로 NOT NULL이 적용된다.




뷰는 가상의 테이블과 같다.
실제로 테이블로 존재하는 건 아니지만, SELECT로 만들어져 뷰에 접근하는 순간 쿼리가 실행되는 방식이다.

  • 단순 뷰: 하나의 테이블로 만들어진 뷰
  • 복합 뷰: 두 개 이상의 테이블과 연관된 뷰
Q.
테이블 A는 a와 b에게 접근 권한이 있고
테이블 B는 a에게만 권한이 있다고 하자.
만약 A와 B를 가지고 복합 뷰를 만들어서, b에게 접근 권한을 주면
B의 데이터도 같이 볼 수 있을까?

>> 그렇다. 그래서 B와 관련된 데이터를 제한하기 위해서는 다른 방법이 필요하다.

뷰의 실체는 SELECT문이므로, 상당히 단순하게 생성할 수 있다.

CREATE VIEW 뷰_이름
AS
SELECT ~;

해서 뷰를 생성한다. 뷰도 테이블 전체에 접근할 때와 마찬가지로 조건식 필터링이 가능하다.

뷰 수정이 가능할까?

뷰는 기본적으로 읽기 전용으로 사용되나, 원본 테이블을 뷰를 통해서 수정할 수도 있다.

구매 목록 뷰를 만들었다.
여기서 John Doe씨 이름을 바꿔보자.
John씨의 의사와 관계 없이 Jonny Doe로 개명시켜버리자.

UPDATE purchase_info SET user_name = 'Jonny Doe' WHERE id = 1;

업데이트 쿼리를 날리고 원본 테이블인 user를 조회했더니 이름이 바뀌어있음을 확인할 수 있었다.
뷰를 통해서도 원본데이터 변경이 가능하다.

뷰는 왜 쓰는 걸까?

  1. 보안
    뷰는 보안에 이점이 있다. 만약 고객의 모든 중요한 정보가 들어있는 테이블이 있다고 하자.
    주민등록번호도 들어 있다.
    만약 고객이 주소지를 변경하고 싶은데, 이는 상담원을 통해서만 변경하고 싶다고 하자.
    상담원이 고객의 모든 중요한 정보까지 접근할 필요가 있을까?
    그렇지 않다. 상담원은 주소만 바꿔주면 된다.
    따라서 상담원에게 제공되는 뷰는 필수적인 id나 이름 등의 정보와 함께 주소 열만 담고 있으면 된다.
    전체 회원 테이블에 접근할 권한을 주지 않고, 이 뷰에만 접근 권한을 주는 것이다.

  2. 쿼리 단축
    데이터를 자주 걸러서 쓸 경우, 그냥 아예 뷰로 만들어버려서 그걸 가지고 처리하는게 더 낫다.

뷰의 실제 작동

뷰를 생성하면서 칼럼명을 실제와 다르게 해서 별칭을 지정할 수도 있다.
뷰의 수정이나 삭제는 테이블과 같이 ALTER VIEW, DROP VIEW를 사용한다.
뷰의 정보 확인도 테이블과 같이 DESCRIBE문을 사용한다.
뷰를 통해 데이터 입력도 가능하나, 이 때 뷰가 원본 테이블의 NOT NULL열을 포함하고 있는지 고려해야 한다. 뷰를 통해 데이터를 추가하면, 원본 테이블에는 있으나 뷰에는 없는 값이 NULL혹은 디폴트로 입력된다.

0개의 댓글