관계형(relational) DB와 비관계형(non-relational) DB

데이터들은 서로 연관되어 있어서 하나의 데이터로 부터 다른 데이터를 읽어오는 경우가 많습니다.

예를들어 학교에 대한 데이터 집합 schools가 있고, 학생들에 대한 데이터의 집합 students가 있다고 가정해 봅시다. 학생들은 학교에 소속되어 있으므로 학생 데이터에 학교데이터의 id를 schoolId로 저장해 놓는다면 학교의 id를 사용해서 해당 학교의 모든 학생들을 찾을 수 있을 것입니다.

관계형(relational) DB

관계형 DB는 위 예제에서 학생데이터의 schoolId 항목을 schools 집합의 id 항목만을 담을 것을 제한할 수 있습니다. 이처럼 데이터 집합의 id만을 담도록 제한된 항목을 foreign key라고 부르고, foreign key를 설정하는 것을 '관계를 형성한다'고 합니다.

아래와 같이 표로 나타낼 수 있겠네요.

schools
idname
1ㄱㄱ학교
2ㄴㄴ학교
students
idnameschoolId
1최xx1
2박xx1
3김xx2

이처럼 관계형 DB는 표의 형태를 하고 있고 이 표를 테이블(table)이라고 부릅니다. 각각의 테이블에는 열(column, 칸)과 행(row, 줄)이 있습니다. 한 줄에 하나의 데이터가 들어가고, 각 칸에는 일정한 항목의 값이 순서대로 들어갑니다.

위의 예제에는 학교 테이블과 학생 테이블이 있습니다. 학교 테이블에는 2개의 데이터가, 학생 테이블에는 3개의 데이터가 있습니다. 학교 테이블에는 id와 name항목이 있고, 학생 테이블에는 id와 name, schoolId항목이 있습니다.

이처럼 관계형 DB는 테이블의 형태에 따라 데이터의 모양이 정해집니다. 이때 이 모양을 스키마(schema)라고 합니다. '학생 테이블의 스키마에는 id와 name 그리고 schoolId항목이 있다'와 같이 사용합니다.

스키마는 별도의 DB명령어에 의해 수정될 수 있습니다.

나중에 학생의 나이도 기록하고 싶다면 학생 테이블의 스키마에 age항목을 추가하여야 합니다. 스키마는 절대적이라서 3번학생까지는 나이를 수집하지 않아서 모르지만 4번부터 나이를 DB에 기록하게 되더라도, 1-3번 학생은 age에 null이 들어갈지언정 age항목 자체는 가지게 됩니다.

비관계형(non-relational) DB

비관계형 DB는 위 학교-학생 예제에서 한학교의 모든 학생 데이터가 학교 데이터에 들어갈 수 있습니다.

schools
{
  id: 1,
  name: 'ㄱㄱ학교',
  students: [
    {
      name: '최xx'
    },
    {
      name: '박xx'
    },
  ],
}
{
  id: 2,
  name: 'ㄴㄴ학교',
  students: [
    {
      name: '김xx'
    },
  ],
}

테이블 구조가 아닌것을 볼 수 있습니다. 위의 구조는 비관계형 DB의 중 하나인 mongoDB의 구조로 나타낸것입니다. 위와 같은 구조에서 하나의 데이터는 document(도큐먼트)라고 부르고 document의 모음을 collection(콜렉션)이라고 부릅니다.

또한 비관계형 DB는 collection에 스키마가 없습니다. 즉 새로운 학생 데이터에 age를 더하게 되면 기존의 데이터들은 전혀 변하지 않지만 새로운 학생 데이터에만 age를 추가해 주면 됩니다.

관계형 DB와 비관계형 DB의 비교

1. ㄱㄱ학교와 해당 학교의 모든 학생들을 읽어오는 일을 수행한다고 할 때, 관계형 DB에서는 schools에서 ㄱㄱ학교를 찾고, students에서 schoolId가 1일 모든 학생들 찾아야 되지만, 관계형 DB에서는 schools에서 ㄱㄱ학교만 찾으면 됩니다. 즉 하려는 일에 따라 비관계형 DB가 더 빠를 수 있습니다.(항상 비관계형DB가 더 빠른 것이 아닙니다!)

데이터의 종류와 목적에 따라 항상 하나의 데이터가 다른 많은 데이터를 품고 있는 경우에는 비관계형 DB가 더 유리함을 알 수 있습니다. 참고로 비관계형 DB라고 해서 관계형성을 전혀 못하는 것은 아닙니다. 위 예제를 관계형 DB처럼 school과 student를 따로 만들고 student에 schoolId항목을 넣어서 비관계형 DB에 저장할 수 있습니다. 비관계형 DB라도 어떠한 상황에서는 반드시 관계를 만들어야 하는 경우도 있습니다.

2. 비관계형 DB는 스키마가 없으므로 확장이 쉽습니다. 관계형 DB에는 age를 추가하려면 DB자체에서 스키마를 변경해주어야 하지만, 비관계형 DB는 스키마가 아예 없으므로 그냥 age를 넣은 데이터를 전달해주기만 하면 됩니다. 반대로 주는 데이터는 DB상에서 아무런 에러없이 무조건 받아드리므로 DB에 연결된 back-end 프로그램이 이 부분에 전적으로 책임을 져야합니다. 즉 DB의 책임까지 back-end 프로그램 개발자가 떠맡게 됩니다.

이처럼 자신의 상황에 맞게 DB를 선택하면 됩니다. 주로 은행과 같이 데이터가 굉장히 중요하고 스키마가 자주 변하지 않는 상황에는 관계형 DB가 더 적합하고, 블로그나 쇼핑사이트같이 DB에서 읽기 처리가 굉장히 빈번하게 일어나고 스키마가 계속해서 변할 계획인 경우에는 비관계형 DB가 더 적합합니다.

DB 관련글

댓글

댓글쓰기

이 글에 댓글을 다시려면 SNS 계정으로 로그인하세요. 자세히 알아보기

UP