"일정한 체계 속에 저장된 데이터의 집합"
-
하나의 컴퓨터에서도 여러 개의 데이터베이스를 생성할 수 있고, 하나의 데이터베이스 안에서 여러 개의 테이블을 만들 수도 있다.
-
테이블에서 하나의 개체를 나타내는 것은 row,
**개체의 각 속성(attribute)**을 나타내는 것은 column이다.
테이블의 행을 레코드(record), 열을 **필드(field)**라고도 한다.
-
MySQL을 비롯한 DBMS들이 'Server-Client' 구조로 동작한다.
서버의 역할을 하는 하나의 프로그램이 실행되고 있고, 사용자는 클라이언트 역할을 하는 프로그램으로 해당 서버에 접속하고, 그 서버에 SQL로 명령을 내리는 구조인 것
-
은행, 거래소 등과 같이 데이터 처리의 정확성, 운영의 안정성 등이 엄격하게 요구되는 분야에서는 Oracle이 주로 사용되고 있고, 우리가 흔히 쓰는 앱, 웹 사이트 같은 서비스를 만들 때는 MySQL을 쓰는 경우가 많다. MySQL은 무료로 사용할 수 있고 좀 더 가볍다는 장점이 있다.
-
MySQL은 여러 DBMS 중에서도 특히 일반 사용자가 사용하기 편하다는 평가를 받는다. 그리고 간단히 사용해볼 때 요구하는 컴퓨터 성능도 작은편이라 부담도 덜하다.
- server(서버 프로그램)
- client로부터 SQL문 등을 전달받아 데이터베이스 관련 작업을 직접 처리하는 프로그램
- MySQL에서 서버 프로그램 이름은 'mysqld', 이 프로그램이 실행되고 있을 때 사용자가 클라이언트 프로그램을 사용해서 접속하면 된다.
- client(클라이언트 프로그램)
- 사용자가 server에 접속해서 원하는 데이터베이스 관련 작업을 할 수 있도록, SQL을 입력할 수 이는 화면 등을 제공하는 프로그램
- MySQL의 클라이언트 프로그램 이름은 **'mysql'**이다. mysql은 보통 CLI(Command Line Interface) 환경에서 사용하기도 하는데 일반 사용자 입장에서는 불편하긴하지만 성능이 빠르다는 장점도 있다. MySQL Workbench는 사용자들이 이용하기 편하도록 GUI(Graphic User Interface)환경에서 작업할 수 있도록 하는 프로그램이다.
- client 프로그램으로 처음 server에 접속하면 생성하지 않았던 "sys" 데이터베이스가 기본으로 생성되어있는 것을 볼 수 있다. sys database는 MySQL server의 성능 관련 정보들을 갖고있는 데이터베이스이다.
- DBMS를 사용하는 사람에 따라 사용용도가 크게 달라진다.
- (1) 기획자/마케터 : 데이터베이스에 저장된 데이터를 잘 분석해서 시장 및 고객을 분석
- (2) 백엔드 개발자/데이터베이스 관리자 : 데이터가 빠르고 안정적으로, 조회 및 저장될 수 있도록 개발 및 관리
- 특히 (2) 백엔드 개발자/데이터베이스 관리자의 입장에서는 DBMS가 성능 저하 없이 효율적으로 작업을 처리하고 있는지 체크하는 것이 매우 중요하다. MySQL에서 이런 정보를 확인할 수 있는 기본 데이터베이스 중 하나가 sys database인 것이다.
- SQL은 관계형 데이터베이스 관리시스템(RDBMS)의 데이터를 관리하기 위해 설계된 특수목적의 프로그래밍 언어이다.
- RDBMS에서 데이터의 조회와 관리, 데이터베이스 스키마 생성과 수정, 데이터베이스 객체 접근 조정관리를 위해 고안되었다.
각 릴레이션을 정의하기 위해 사용하는 언어
CREATE,ALTER,DROP, ...
데이터를 추가/수정/삭제하기 위한, 즉 데이터 관리를 위한 언어
SELECT,INSERT,UPDATE,DELETE,...
사용자 관리 및 사용자별로 릴레이션 또는 데이터를 관리하고 접근하는 권한을 다루기 위한 언어
GRANT,REVOKE, ...
-
SQL은 대소문자를 가리지 않는다.
(단, 서버 환경이나 DBMS 종류에 따라 데이터베이스 또는 필드명에 대해 대소문자를 구분하기도 한다)
-
SQL 명령은 반드시
세미콜론(;)으로 끝나야 한다. -
고유의 값은
따옴표('')로 감싸준다. -
SQL에서 객체를 나타낼 때는
백틱(``)으로 감싸준다. -
주석은 일종의 도움말로, 주석 처리된 문장은 프로그램에서 동작하지 않는다.
한줄 주석은 문장 앞에
--를 붙여서 사용한다.여러줄 주석은
/* */로 감싸준다.
데이터베이스에 관한 모든 설계사항
-
'스키마는 만드셨나요?'
-
'이번에 앱이 업데이트되면 스키마에 큰 변화가 있을 것 같습니다.'
-
'스키마가 우리 비즈니스 상황에 최적화되지 않은 것 같군요'
어떤 데이터베이스를 새롭게 구축할 때는 가장 처음에 '스키마'를 짜야한다. 이 스키마를 짜는 것을 '데이터베이스 모델링' 또는 '데이터베이스 디자인'이라고 한다.
그런데 각 DBMS마다 스키마(Schema)를 다르게 정의하여 사용하고 있다. MySQL에서는 스키마 = 데이터베이스, Oracle에서는 스키마는 하나의 사용자가 만든 각종 객체(테이블, 뷰 등)의 집합을 의미한다.
하나의 조직, 하나의 기관, 하나의 서비스 등에서 필요로 하는 데이터베이스 설계사항을 의미한다. 보통 스키마라고 하면 이 개념적 스키마를 의미한다.
물리적 스키마는 데이터를 실제로 컴퓨터의 저장장치에 어떤 방식으로 저장할 것인지를 결정하는 스키마이다. 만약 member라는 테이블이 있고 그 안에 id, name, age 등의 컬럼이 있을 때 각 컬럼의 값들을 어떤 방식으로 저장할지에 관한 설계사항이다. 그래서 물리적 스키마는 저장 스키마(Storage Schema), **내부 스키마(Internal Schema)**라고도 한다.
물리적 스키마는 일반 개발자나, 사용자가 다룰 일이 없다. MySQL, Oracle과 같은 DBMS를 만드는 개발자들이 다루는 개념이다. 그리고 똑같은 개념적 스키마더라도 DBMS에 따라 물리적 스키마는 전혀 달라질 수 있다. 같은 데이터라도 컴퓨터에 실제로 어떻게 저장할지는 DBMS에 따라 다르기 때문이다.
기존 직원 분들의 설명을 듣고, 문서화된 자료를 읽는 것이 가장 좋다. 그리고 그것과 동시에 데이터베이스 현황을 간단하게 파악할 수 있는 SQL 문을 알고 직접 적용해보는 것이 좋다.
-
어떤 데이터베이스들이 있는지
SHOW DATABASES;
-
각 데이터베이스 안에 어떤 테이블들이 있는지
-- 하나의 데이터베이스 안의 테이블들(뷰도 포함) 파악 SHOW FULL TABLES IN copang_main;
-
각 테이블의 컬럼 구조는 어떻게 되는지
-- 한 테이블의 컬럼 구조 파악 DESCRIBE item; -
테이블들 간의 Foreign Key 관계는 어떤지
- 두 테이블의 각 컬럼 간에 Foreign Key 관계가 논리적으로 성립한다고 해도, 실제 DBMS 상에서는 관리자가 그것을 Foreign Key로 설정하지 않는 경우도 많다. 관리자의 실수일 수도 있고, 데이터베이스의 성능을 고려해서 의도적으로 외래키 설정을 안했을 수도 있다.
-- 모든 데이터베이스에서 모든 테이블간의 Foreign Key(외래키) 파악 SELECT i.TABLE_SCHEMA, i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME FROM information_schema.TABLE_CONSTRAINTS AS i LEFT JOIN information_schema.KEY_COLUMN_USAGE AS k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY';

