오늘 DB수업시간에 누군가 질문 했던 이야기인데요.
Q) Let R=(A,B,C), S=(D,E,F). r(R)과 r(S)에 대해 Relational Algebra r x s와 동일한 SQL문은?
답은 SELECT distinct * FROM r,s 입니다. RDBMS가 relational algebra의 모든 식을 표현할 수 있어 relationally complete 하지만, RDBMS가 relational algebra와 같은건 아니죠.
가장 큰 차이는 RDBMS의 테이블이란 것은 중복을 허가하고 relational algebra는 그렇지 않단거죠. relation의 정의가 원래 cartesian product의 subset이거든요. 다시 말해 relation은 set이죠. 그리고 set에서는 원래 중복이 허가가 되지 않죠.
따라서 SQL에서 distinct를 꼭 써야 relational algebra와 같아집니다.
이와같이 RDBMS에서 중복을 허가하는 이유는
1) 모든 사람이 중복이 제거된 테이블을 원하는 것은 아니다.
2) 중복을 제거하기 위해서는 sort가 수반되는데 그 비용이 크다.
라는 두가지 이유가 있습니다.
물론 DB전공할 것도 아니면서 이런 자잘하고 한정된 이야기까지 알아야하는 건 아니지만, 적어도 CS 석사/박사과정이면 알아두는 것도 좋을듯. 이건 학부과정 교재에 다 나온 이야기거든요. 아무래도 제가 수업듣는 곳에서의 학생들은 진학할때 전공 리뷰를 하지 않아서 그런지 빡시게 복습을 안한 듯..