#TIL

테이블간의 Cardinality와 객체 내의 Attribute간의 Cardinality?

Introduction

며칠 전 친구한테 질문을 받았다. 학교의 DB 과제였는데, DB 모델링시 테이블간의 Cardinality는 중요하게 여겨지는데, 한 테이블(Entity가 속하는) 안의 Attribute간의 Cardinality는 중요하게 여기지 않는 이유를 설명하라는 것이었다.

당연하게 걍 신경안써도 되는거 아님? 이라는 말을 하기 싫었다. 따라서 나름대로의 이유를 생각하고 조사해보았다.

이런 질문에 답하기 위해서는 Cardinality의 정의그러면 왜 테이블간의 Cardinality를 신경쓰는가?에 먼저 답하는 것이 중요하다.

Cardinality의 정의

Cardinality는 집합론에서 사용하는 단어로, 집합의 크기를 뜻한다.

the cardinality of a set is a measure of the "number of elements" of the set.
(https://en.wikipedia.org/wiki/Cardinality)

그리고 이 단어는 다양한 상황에 다르게 사용된다. 이러한 차이에서 이해에 혼란이 온다.

Cardinality in One Attribute

한 Attribute에 대해, Cardinality는 그 Attribute에 나오는 값의 갯수다.
전체 Entity가 100개여도, 값의 종류는 100개 이하일 수 있다. (물론 100개를 넘을 순 없다.)
이 개념은 데이터베이스 시스템에서 SQL 성능 예측시 사용되며, Selectivity를 계산할 때 쓰인다. (Cardinality / number of Entity)

테이블간의 Cardinality

두 테이블간의 관계를 나타낸다. 1:1, 1:n, n:1, n:m 이런식으로 표현한다.
이러한 관계는 두 테이블을 Join할 때 생겨나는 것에 주목하자. 따라서 한 Attribute의 Cardinality랑 이름은 같고 내용은 다른 친구다.

(언듯 생각하면 집합의 크기라는 정의랑 어긋나는거같지만, A테이블과 B테이블을 Join했을 시, A테이블의 값 한개당 얼마나 다양한 경우의 수(집합의 수)가 나올 수 있는가?로 생각하면 그렇게 틀린것 같지 않다.)

Attribute간의 Cardinality

질문에서 최종적으로 물어보는 것이다. 과제에서의 정의로는 한 Attribute를 한 Entity처럼 생각하고 진행하는 것으로 보인다.
그렇다면 테이블간의 Cardinality와 같이 정의할 수 있을 것이다.
ex) Product 테이블이 있을 시, Product_IDQuantity 사이의 Cardinality를 생각할 수 있다. (하지만 의미가 없다. 잘 설계된 데이터베이스는 애초에 의미를 없앨테니까... 정의를하자면 1:1이려나? ID가 하나 있으면 Quantity도 하나 있어야하니까...)

그래서 왜 Attribute간의 Cardinality를 신경쓰지 않는것인가?

목적이 없다는 것으로 정리할 수 있다..
우리가 테이블간의 Cardinality를 따지는 이유를 생각해보자.
Cardinality를 고려하여 Join시 명령을 만들고, Primary key를 지정하고, Foriegn Key를 설정하고 한다. 이러한 목적이 있다.
Attribute간 Cardinality는 따질 필요가 없다. 얻는 이득이 없다.

다양한 의견을 기다립니다.

사실 내 생각이 맞는지 확신이 서지 않는다.
이러한 답이 없는 문제가 골치아픈거 같다.

다양한 의견을 기다리고 있습니다.