데이터를 저장, 보존 및 연산하는 시스템이다. Database와 반대되는 개념은 메모리이다. 메모리는 휘발성이며, 컴퓨터를 종료하면 저장해둔 데이터가 없어진다. 하지만 속도가 매우 빠르다는 장점이 있다.
주로 Databse에 데이터를 장기적으로 저장해두었다가 메모리로 읽어들여서 가공을 진행한다. File에 저장해도 될텐데 왜 굳이 DB를 사용하는걸까? 그 이유는 DB를 이용할때 data 접근 및 가공이 훨씬 편리하기 때문이다.
일반적으로 database에는 크게 관계형 데이터베이스(RDBMS)와 "NoSQL"로 명칭되는 비관계형(Non-relational) database가 있다.
데이터를 서로 상호관련성을 가진 형태로 표현한 관계형 데이터 모델에 기초를 둔 데이터베이스 시스템을 말한다.
모든 데이터들은 2차원 테이블(table)들로 표현 된다. 각각의 테이블은 컬럼(column)과 row(로우)로 구성되며 Column은 테이블의 각 항목, Row는 각 항목의 실제 값들이다.
각 Row에는 고유 키(Primary Key)가 있다. 주로 이 primary key를 통해서 해당 Row를 찾거나 인용(reference)하게 된다.
각각의 테이블들은 서로 상호관련성을 가지고 서로 연결될 수 있다. 테이블끼리의 연결에는 크게 3가지 종류가 있다.
대표적인 관계형 데이터베이스에는 MySQL과 PostgreSQL(줄여서 Postgres)가 있다.
Foreign key(외부키)라는 개념을 사용해서 주로 연결한다. 앞서 본 one to one 예를 다시 살펴보자.
user_profiles 테이블의 user_id
컬럼은 users 테이블에 걸려있는 외부 키(Foreign Key)라고 지정한다. user_id의 값은 users table의 id 값이므로 id 컬럼에 존재하는 값만 들어가야 한다.
Foreign key를 지정해주면 user_profile table에서 users table을 참조할 수 있게 된다. 만약 user_profile에서 해당 user의 name
이 궁금하다면 foreign key(user_id
)를 참조하여 해당 user를 찾고(같은 id값을 가진 user를 찾아간다.) name
을 찾을 수 있는 것이다.
왜 정보를 여러 테이블에 나누어서 저장해야할까? 하나의 테이블에 모든 정보를 다 넣으면 동일한 정보들이 불필요하게 중복되어 저장되기 때문이다. 더 많은 디스크를 사용하게 되고 잘못된 데이터가 저장 될 가능성이 높아진다.
이 문제를 해결하기 위해 여러 테이블에 나누어서 저장한후 필요한 테이블 끼리 연결시킨다. 중복된 데이터를 저장하지 않음으로 디스크를 더 효율적으로 쓰고, 또한 서로 같은 데이터이지만 부분적으로 틀린 데이터가 생기는 문제가 없어진다. 이것을 normalization(정규화)이라고 한다.
작업 수행의 논리적 단위, 일련의 작업들을 한번에 하나의 unit으로 실행하여 중간에 실패하면 처음의 상태로 다시 돌아가는 rollbock을 수행하고, 오류없이 마치면 commit을 해서 변경사항을 반영한다. 즉, 모두 다 성공하거나 아니면 모두 다 실패하는 두가지의 경우로 나뉜다.
비관계형 타입의 데이터를 저장할때 주로 사용되는 데이터베이스 시스템이다. 관계형 데이터베이스는 데이터들을 저장하기 전에 어디에 어떻게 저장할것인지를 정의 해야한다. 테이블 이름, 테이블과 다른 테이블의 관계, 각 컬럼의 타입 등등 테이블을 정의해야한다. 하지만 비관계형 타입의 데이터는 관계형 데이터와는 달리 저장하기 전에 정의 할 필요가 없다.
MongoDB, Redis, Cassandra 등이 가장 대표적인 NoSQL 데이터 베이스이다.
[참조]
https://stackoverflow.com/c/wecode/questions/145
http://sindhusps.blogspot.com/2018/04/rdbms.html
https://www.studytonight.com/dbms/database-key.php\
https://en.wikipedia.org/wiki/Many-to-many_(data_model)