광고 매크로 없는 청정한 블로그를 위해 노력중입니다. 근데 나만 노력하는 것 같음… ㅡㅡ
반응형

https://koreanraichu.tistory.com/776

 

엔터티

'것'SQLD 하게 되면 제일 먼저 배우는게 엔터티, 관계 그리고 속성이다. 그 중에서도 엔터티는 설명이 그냥 '어떤 것'이다. 그니까 말 그대로 어떤 '것'이요. 엔터티의 정의를 보면업무에 필요한 정

koreanraichu.tistory.com

여기서 엔터티가 '것'이라고 했는데, 그 엔터티가 무엇인지를 정하는 게 엔터티의 속성이고 다른 엔터티와 어떤 사이인지를 정하는 게 관계이다.


관계의 분류

관계는 크게 존재에 의한 관계와 행위에 의한 관계로 나뉜다. 어떤 엔터티가 존재하는 것 만으로도 관계가 형성된다면 그건 존재에 의한 관계이고, 특정한 업무를 수행함에 따라서 엔터티간에 관계가 형성되는 건 행위에 의한 관계이다. 피카츄랑 라이츄는 존재하는 것 그 자체로 진화관계라는 관계가 형성되고, 회사와 사원은 존재하는 것 만으로도(물론 사원이 입사는 해야겠지만…) 두 엔터티간의 관계가 형성된다.

 

그럼 행위에 의한 관계는 뭔가요? 얘가 뭘 하면 사건 엔터티가 생기는 거다. 이브이를 에브이로 진화시킬 때는 진화한다는 사건 엔터티가 생겨나게 된다. 사천왕이랑 포켓몬 리그에서 배틀을 할 때 나라는 엔터티와 사천왕이라는 엔터티 사이에도 배틀한다는 사건 엔터티가 생겨나게 된다. 이런 식으로 두 관계 사이에 사건 엔터티가 존재하면 그건 행위에 의한 관계이다.

 

관계 차수

저 그림은 뭔데요? ERD요. 일단 하나씩 보면서 저 그림의 작대기가 뭘 의미하는지 알아봅시다. 일단 저 방식은 IE/Crow's foot 방법인데, 새 발같이 생겨서 뭐 그렇다고 한다.

 

관계에는 크게 1:1 1:N(1:다), M:N(다:다)이 존재한다. 1:1의 예시로 나온 게 피카츄와 라이츄인데... 리전폼이 있지 않냐고요? 리전폼이 있긴 한데 진화 라인 일부만 리전폼이 존재하는거라서 알로라지방에서만 캬라멜뚱쥐가 된다. 그럼 저 그림은 뭔 의미예요? 

 

일단 피카츄 앞에 있는 한줄짜리 작대기는 라이츄 입장에서의 관계이고, 라이츄 앞에 있는 동그라미랑 작대기가 피카츄 입장에서의 관계다. 그러니까 피카츄의 관계는 오른쪽으로, 라이츄의 관계는 왼쪽으로 읽으면 되는거다. 그리고 저 작대기의 의미는 1) 피카츄는 라이츄로 진화하지 않을 수도 있고(동그라미), 진화할 수도 있다(작대기) 2) 라이츄는 피카츄에서 진화해야만(작대기) 한다는 의미이다. 저 동그라미가 있으면 옵션? 뭐 그런거라고 보면 된다.

 

이브이의 경우 진화체가 많아서 엔터티를 뭘로 하느냐에 따라 1:1인지, 1:다인지가 갈린다. 이브이의 진화체는 총 8마리로, 8마리의 진화체에 대해 개별적으로 엔터티를 만든다면 피카츄-라이츄의 예시처럼 1:1이 된다. 그리고 위 예시처럼 진화체'들'로 엔터티를 만들게 되면 관계가 1:다가 된다. 왜죠? 이브이는 조건만 만족하면 어떤 진화체로든 진화할 가능성이 있잖아요. 마찬가지로 오른쪽에 있는 동그라미는 '이브이가 진화를 하지 않고 이브이로 남을 수도 있다'는 의미이다. 반면 이브이의 진화체 입장에서는 이브이가 진화를 해야 존재할 수 있으니 필수적인 관계인 셈.

 

다대다에 있는 쿠텔라는 그 뭐지? 발라먹는 쿠키 스프레드다. 먹어보고싶은데 이마트에는 없는게 단점... 아무튼 다대다는 뭔 의미죠? 아니 그나저나 저 닭발은 뭐죠? 닭발이 있으면 다(多)인겁니다. 봐봐요, 쿠키 스프레드에도 다양한 종류가 있고(쿠키 말차 인절미), 그걸 시키는 소비자들 역시 다양하잖아요? 비단 쿠키 스프레드가 아니더라도 파스타 소스나 옷같은걸로 예시를 들어도 그렇다. 후드티는 다양하고 그걸 사는 사람도 한 명이 아니잖음.

 

필수 vs 선택

어디서 많이 봤다고요? 위 예시의 그거다. 관계에는 필수적 관계와 선택적 관계라는 게 있는데, 관계 형성 시 한쪽 엔터티의 인스턴스에 대응되는 인스턴스가 반대편 엔터티에 존재해야 하는 관계는 필수적 관계(예: 라이츄->피카츄)이고, 관계 형성 시 한쪽 엔터티의 인스턴스에 대응되는 인스턴스가 반대편 엔터티에 하나도 존재하지 않는 경우가 존재할 수도 있는 관계(예: 피카츄->라이츄)는 선택적 관계이다.

 

예를 들어보자. 요즘은 가게에서 뭐 사면 영수증 잘 안 받죠? 그러므로 주문->영수증은 선택적인 관계이다. 반면 영수증->주문은요? 주문을 해야 영수증이 나오니까 이건 필수적인 관계다. 이런 식으로 어떤 관계를 형성하기 위해서 '적어도 하나는 있어야'하는 걸 필수적인 관계라고 한다. 여기까지 이해되셨죠? 그럼 속성으로 넘어가자.


속성이란 무엇인가

위 글에서 엔터티를 뭐라고 설명했는지 기억나는가? 그죠. '것'이다. 진짜로 그게 다였다. 아니 진짜 그게 다인가요? 예. 엔터티는 그냥 어떤 '것'이니까요. 그리고 이 어떤 '것'이 다른 '것'과 어떤 형태로 연결되어있는지를 보여주는 게 관계이고, 속성은 얘가 뭔지를 알려주는거다. 예를 들어서 이브이라는 엔터티가 있다면 키, 몸무게, 도감번호, 이름같은 게 속성이 되는거다.

 

엔터티는 둘 이상의 인스턴스와 둘 이상의 속성을 가지고, 각 속성은 속성값을 하나씩 가지게 된다. 물론 NULL인 값이 있을 수도 있음. 포켓몬 타입도 하나인 경우가 있고 두개인 경우가 있는데, 이때는 2타입이 NULL이 된다. 아니, 그럼 그 타입을 타입 1, 타입 2 이렇게 기록하면 안되나요? 그거 원자성 위반이라 째야됨.

 

ERD에 들어가는 뚠뚠한 네모…가 엔터티이다. 위에 있는게 엔터티 이름이고, 엔터티를 쭉 가로지르는 가로선 위에 있는게 PK이다. 이건 포켓몬 도감 엔터티인데, 여기서는 도감 번호랑 폼체인지 빼고 다 일반속성이다. FK는 없다. 그러면 속성이 지금 도감번호, 폼체인지, 이름, 타입1, 타입2, 키, 몸무게, 분류 이렇게 8개인데… 근데 읽다보니 인스턴스라는 얘기가 나오는데 그건 뭐예요? DB에 INSERT INTO로 넣는거요.

 

그러니까 저대로 테이블을 만들고 이상해씨의 도감 정보를 기록했다면 엔터티 안에 인스턴스가 하나 들어간거다. 그리고 이 인스턴스는 위에서 정한 PK... 그니까 도감번호랑 폼체인지에 함수적으로 종속되는 관계가 된다. 완전히 종속 안되면요? 부분 함수 종속 찢어야죠. 우리 정규화 했잖아요.

 

근데 생각해보니까 테이블에 INSERT INTO로는 한줄 넣어도 되는데 왜 두개인거임? 칼럼 제목 표시줄도 포함되나?

 

도메인

정의를 보면 어떤 속성이 가질 수 있는 값의 범위, 데이터 타입, 크기, 그 외의 제약 사항들이라고 하는데, 이건 어렵게 생각할 필요 없다. 일단 이걸 보자.

CREATE TABLE restriction_enzyme (
    Enzyme VARCHAR(15) PRIMARY KEY,
    Source VARCHAR(100),
    Recognition_sequence VARCHAR(100),
    Restriction_site VARCHAR(100) NOT NULL,
    Isoschizomers VARCHAR(300)
);

정규식 갖고 노는데는 제한효소가 짱입니다. 특히 시퀀스에 ATGC 말고 다른 알파벳 들어가는 애들. 아무튼… 이거 그래서 실제로 내가 테이블 만든거다. 저 괄호 안에 들어있는게 순서대로 칼럼명, 데이터 타입, 제약(PK냐 널 안되냐 이런거)이다. 엔자임이라는 칼럼은 VARCHAR(15)니까 글자 영문자 기준으로 15자까지만 되고(한글은 3씩 계산해서 5자까지), PRIMARY KEY니까 NOT NULL(널 비허용)이고 UNIQUE(값이 유일해야 함)해야 한다. 이런 식으로 제약사항을 정해둔 것이다.

 

속성의 분류법

속성의 특성에 따른 분류

속성의 특성에 따라서 분류할때는 기본속성, 설계속성, 파생속성으로 나눈다. 셋이 무슨 차이냐고? 일단 기본속성은 그냥 지극히 일반적인 속성이다. 제품명, 수량, 가격 이런 것들. 그리고 설계속성은 데이터 모델링을 위해 새로 만든 속성인데, 보통 예시로 많이 드는 게 제품 코드이다. 마지막으로 파생속성은 뭐에서 파생된 속성이라는건데… 이게 어디서 파생되는건가요? 다른 속성들에서 뭐 평균이나 최빈값같은 거 계산한 게 파생속성이다.

 

엔터티의 구성 방식에 대한 분류

이거는 위에것보다 외우기 쉽다. PK는 Primary Key, FK는 Foreign Key인데 둘 다 표에서 키로 쓰이는 건 똑같다. 그리고 PK도 FK도 아닌 놈이 일반속성이고, 이 일반속성이 다른 속성과 함수적 종속성을 갖는 경우 3차 정규화를 통해 찢어놔야 한다.

 

그럼 저 둘은 뭔 차이인데요? PK는 PK다. 이걸로 지정하는 순간 걔는 값이 NULL이어도 안되고, 겹쳐서도 안된다. 왜죠? 쟤로 유일한 인스턴스 하나를 찝어야되잖아요. 그럼 FK는요? 남의 집 키 갖다 쓰는게 FK다. Foreign이잖음. 저 FK를 일반 키로 쓸 수도 있고 PK로 쓸 수도 있는데, PK로 쓰게 되면 FK를 물려줄(?) 표를 먼저 만들고 쟤를 만들어야 한다. 만들고 잇는 방법도 있는데 걍 PK를 주는 애 먼저 만들자.

 

분리 가능성에 따른 분류

분리가 뭔데요? 속성이란 '의미상 더 이상 분리되지 않는 최소한의 데이터 단위'를 의미하지만, 그럼에도 찢어질 수 있는 속성이 있다. 여러분들 주소 입력받을 때 어떻게 받는지 기억하시죠? 우편번호+시군구읍면동+상세주소 받잖아요. 여기서 시군구읍면동(예: 서울특별시 중구 명동)은 찢어질 수 있다. 예시로 든 주소는 시+구+동으로 찢어지잖아요. 이렇게 더 작은 단위로 찢을 수 있는 건 복합 속성이고, 더 이상 못 찢는(찢으면 말이 안 되는) 속성은 단일 속성이라고 한다.

 

이름 역시 복합 속성이다. 왜요? 성+이름으로 찢을 수 있잖아요. 뭐 미쿡 이런데는 미들네임도 있더만.

 

속성 값의 수에 따른 분류

자바스크립트 만져보신 분들은 라디오버튼과 체크박스의 차이를 아실것이다. 사이트에서 동글뱅이 버튼 누르는거 있죠? 뭐 선택할때. 그치 그게 라디오 버튼이지. 그리고 체크박스는 네모나게 생겨서 클릭하면 V자 차는게 체크박스다. 아니 저희 데이터 하는데 왜 갑자기 그게 나와요? 이게 속성이랑 연관지을 수 있는 건덕지가 있거든.

 

단일값은 라디오버튼, 다중값은 체크박스다. 아니 왜죠? 동글뱅이 버튼이랑 체크박스를 각각 언제 쓰는지 생각해보면 답이 나온다. 보통 얘네들 중 하나만 골라야 할 때는 동글뱅이 버튼을 쓰고(예: 성별, 연령대), 얘네들 중 여러개를 골라도 되는 경우에는 체크박스(예: 취미, 관심사)를 쓴다. 이게 뭔 상관이냐고? 들어봐요. 라디오버튼은 이중에 하나만 고르는거니까 값이 하나지만, 체크박스는 여러개를 고를 수 있으니까 고르는만큼 값이 될 거 아닙니까.

 

속성값이 하나이면 단일값, 여러개이면 다중값인데 저거 한 칼럼에 콤마로 몰아쓰면 어차피 찢어야됨.

 

반응형

'Coding > 코딩잡담' 카테고리의 다른 글

롤업, 큐브, 그리고 그루핑 셋  (0) 2025.11.13
NULL이란 무엇인가  (0) 2025.11.12
반정규화  (0) 2025.11.11
정규화  (0) 2025.11.10
조인들이 모였네  (0) 2025.11.10