관계형 데이터베이스는 테이블을 사용하고, 키와 값을 사용하는 데이터베이스의 한 종류.
데이터의 종속성을 관계(Relationship)로 표현하는 것이 관계형 데이터베이스의 특징.
데이터베이스에 저장되는 데이터 구조와 제약 조건을 정의한 것.
정의된 스키마에 따라 데이터베이스에 실제로 저장된 값.
행과 열로 구성된 데이터 집합.
보통 관계형 데이터베이스의 테이블을 릴레이션(Relation)이라 부름.
정보를 구분하여 저장하는 기본 단위
다른 테이블 기반으로 만들어진 가상테이블.
릴레이션의 열
파일 구조에서 열
릴레이션의 행
파일구조에서 행
하나의 릴레이션에서 속성의 전체 개수.
정적인 특성.
하나의 릴레이션에서 튜플의 전체 개수.
동적인 특성.
검색, 정렬 시 튜플을 구분할 수 있는 기준이되는 속성 또는 속성의 집합
튜플을 유일하게 구별하기 위해 꼭 필요한 최소한의 속성 또는 속성의 집합
Ex
- (고객 이름) 속성은 후보키? -> 불가능 (동명이인 -> 유일성 X)
- (고객 아이디) 속성은 후보키? -> 가능 (같은 고객 아이디 X)
- (고객 아이디 + 고객 이름) 후보키? -> 불가능 (고객이름 필요 X -> 최소성 X)
여러 후보키 중에서 기본적으로 사용할 키
Ex
후보키 : (고객 아이디), (고객 이름 + 주소)
-> (고객 아이디)
후보키 중 기본키를 제외한 나머지 키 = 보조키
Ex
후보키 : (고객 아이디), (고객 이름 + 주소)
-> (고객 이름 + 주소)
유일성은 만족하지만 최소성은 만족하지 않는 속성 또는 속성의 집합
어떤 릴레이션에 소속된 속성 또는 속성 집합이 다른 릴레이션의 기본키가 되는 키
Ex
주문 릴레이션의 (주문 고객) 속성은 고객 릴레이션의 (고객 아이디)를 참조
- 주문 릴레이션 : 참조하는 릴레이션 (외래키 가짐)
- 고객 릴레이션 : 참조되는 릴레이션 (기본키 가짐)
- 외래키 : 참조하는(주문) 릴레이션의 (주문 고객)
두개 이상의 테이블이나 데이터베이스를 연결하여 데이터를 검색하는 방법
모든 경우의 수를 전부 표현해주는 방식
A가 3개, B가 4개면 총 3 * 4 = 12개의 데이터 검색
SELECT
A.NAME, B.AGE
FROM EX_TABLE A
CROSS JOIN JOIN_TABLE B
자기 자신과 자기 자신을 조인하는 것
하나의 테이블을 여러번 복사해 조인
자신이 갖고 있는 컬럼을 다양하게 변형시켜 활용할 때 자주 사용
SELECT
A.NAME, B.AGE
FROM EX_TABLE A, EX_TABLE B
응용 프로그램 보안 상의 허점을 의도적으로 이용해, 악의적인 SQL문을 실행되게 함으로써 데이터베이스를 비정상적으로 조작하는 공격 기법
1. 인증 우회
SQL 인젝션 공격의 대표적이 경우로, 로그인 폼(Form)을 대상으로 공격.
정상적인 계정 정보 없이도 로그인을 우회하여 인증 획득 가능.
Ex1
로그인 시, 아이디와 비밀번호를 input 창에 입력
SELECT * FROM USER WHERE ID = "abc" AND PASSWORD = "1234";
input 창에 비밀번호를 입력함과 동시에 다른 쿼리문 입력
"1234"; DELETE * USER FROM ID = "1";
보안이 완벽하지 않은 경우, 이처럼 비밀번호가 아이디와 일치해서 True가 되어 뒤에 작성한 DELETE 문이 데이터베이스에 영향을 줄 수도 있음.
Ex2
비밀번호 입력창에 ' or '1' = '1와 같이 입력하면 '으로 앞 쿼리문을 닫고 '1' = '1'과 같은 true 문을 작성해 무조건 적용되도록 수정한 뒤 DB를 마음대로 조작 가능
SELECT * FROM client WHERE name = 'anjinma' AND password ='' or '1' = '1'
2. 데이터 노출
시스템에서 발생하는 에러 메시지를 이용해 공격하는 방법.
보통 에러는 개발자가 버그를 수정하는 면에서 도움을 받을 수 있지만, 해커들은 이를 역이용해 악의적인 구문을 삽입해 에러 유발.
Ex
해커는 GET 방식으로 동작하는 URL 쿼리 스트링을 추가하여 에러 발생시킴.
이에 해당하는 오류가 발생하면, 이를 통해 해당 웹앱의 데이터베이스 구조를 유추할 수 있고 이를 해킹에 활용
URL을 통해 파라미터를 주고받는 GET 방식은 해커가 단순히 URL을 통해 전달될 파라미터를 조작하면 손쉽게 SQL injection 취약점 적용 가능
http://test.com/login.php?id=abc1234 and password=''
1. 입력 값에 대한 검증
검증 로직을 추가해 미리 설정한 특수문자들이 들어왔을 때 요청을 막아냄
2. SQL 서버 오류 발생 시, 해당하는 Error Message 노출 금지
View를 활용해 원본 데이터베이스 테이블에는 접근 권한을 높임.
일반 사용자는 View로만 접근해 에러를 볼 수 없도록 만듦
3. Prepared Statement 구문 사용
Prepare Statement를 사용하면, 특수문자를 자동으로 escaping 해준다. (Statement와는 다르게 쿼리문에서 전달인자 값을 ?로 받는 것) 이를 활용해 서버 측에서 필터링 과정을 통해서 공격을 방어한다.
String sql = "SELECT NAME, AGE FROM TABLE WHERE USERID = " + userID
String sql = "SELECT NAME, AGE FROM TABLE WHERE userID = ?"
https://usishi.com/category/yazilim
1. 확장성
SQL
NoSQL
2. 관계
SQL
NoSQL
Sharding(샤딩)은 같은 테이블 스키마를 가진 데이터를 다수의 DB에 분산하여 저장하는 방법.
이 기술을 접목하면 SQL도 수평적 확장을 적용할 수 는 있지만, 실제 구현은 어렵다고 함.
3. 속성
SQL
NoSQL
CAP 이론
- Consistency (일관성) : 모든 요청은 최신 데이터 또는 에러를 응답받음. (DB가 3개로 분산되었다고 가정할 때, 하나의 특정 DB의 데이터가 수정되면 나머지 2개의 DB에서도 수정된 데이터를 응답받아야 함.)
- Availability (가용성) : 모든 요청은 정상 응답을 받음. (특정 DB가 장애가 나도 서비스가 가능해야 한다.)
- Partitions Tolerance (분리 내구성) : DB간 통신이 실패하는 경우라도 시스템은 정상 동작 한다.
4. 스키마
SQL
NoSQL
SQL
관계를 맺고 있는 데이터가 자주 변경되는 경우, 또 명확한 스키마가 사용자와 데이터에게 중요한 경우 관계형 데이터베이스를 사용하는게 좋음. 금융 산업과 같은 시스템의 형태가 급격하게 변하지 않으면서 그 안의 데이터가 계속 바뀌는 보수적인 시스템에서 유리.
NoSQL
비관계형 데이터베이스는 정확한 데이터 구조를 알 수 없거나 변경 / 확장 될 수 있는 경우 (수평적으로), 읽기 처리는 많이 하지만, 데이터를 자주 변경하지 않는 경우 사용하면 유리함.
테이블을 설계할 때 잘못 설계하여 데이터를 삽입, 삭제, 수정할 때 논리적으로 생기는 오류
학번 | 이름 | 나이 | 성별 | 강의코드 | 강의명 | 전화번호 |
---|---|---|---|---|---|---|
1011 | 이태호 | 23 | 남 | AC1 | 데이터베이스 | 010-0000-0000 |
1012 | 강민정 | 20 | 여 | AC2 | 운영체제 | 010-1111-1111 |
1013 | 김현수 | 21 | 남 | AC3 | 자료구조 | 010-2222-2222 |
1013 | 김현수 | 21 | 남 | AC4 | 웹 프로그래밍 | 010-2222-2222 |
1014 | 이병철 | 26 | 남 | AC5 | 알고리즘 | 010-3333-3333 |
자료를 삽입할 때 의도하지 않은 자료까지 삽입해야만 자료를 테이블에 추가가 가능한 현상
Ex
강의를 아직 수강하지 않은 새로운 학생을 삽입할 경우 강의 코드와 강의명 속성에는 NULL 값이 들어가야하는 문제
Ex
강의 코드가 "AC3"인 김현수의 전화번호를 수정할 경우, 3번째 튜플의 데이터만 수정됨.
3, 4번째 튜플은 같은 사용자 데이터임에도 불구하고 전화번호가 다름.
Ex
강의 코드가 "AC1"인 데이터베이스 개론 강의를 삭제하면, 이태호의 데이터까지 삭제됨.
이러한 이상 현상을 예방하고 효과적인 연산을 하기 위해 데이터 정규화(Data Normalization)를 함.
추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조.
만약 우리가 책에서 원하는 내용을 찾는다고 하면, 책의 모든 페이지 찾아 보는 것은 오래 걸림.
데이터베이스의 index == 책의 색인
데이터베이스에서도 테이블의 모든 데이터를 검색하면 시간이 오래 걸려
데이터와 데이터의 위치를 포함한 자료구조를 생성하여 빠르게 조회할 수 있도록 함
인덱스를 활용하면, 데이터를 조회하는 SELECT 외에도 UPDATE나 DELETE의 성능이 함께 향상.
// Mang이라는 이름을 업데이트 해주기 위해서는 Mang을 조회해야 한다.
UPDATE USER SET NAME = 'MangKyu' WHERE NAME = 'Mang';
만약 index를 사용하지 않은 컬럼을 조회해야 하면 전체를 탐색하는 Full Scan을 수행.
Full Scan은 전체를 비교하여 탐색하기 때문에 처리 속도가 느림.
테이블을 생성하면, MYD, MYI, FRM 3개의 파일 생성
INSERT
기존 Block에 여유가 없을 때, 새로운 Data가 입력됨
DELETE
UPDATE
해시 테이블(Hash Table)
(Key, Value)로 데이터를 저장하는 자료구조, 빠른 데이터 검색이 필요할 때 유용.
해시 테이블은 Key 값을 이용해 고유한 Index 생성 후, 그 Index에 저장된 값 꺼내오는 구조
B+ Tree
자식 노드가 2개 이상인 B-Tree를 개선시킨 자료구조.
모든 노드에 데이터(Value)를 저장했던 B-Tree와 다른 특성을 가짐
- 잎노드(데이터 노드)만 인덱스와 함께 데이터(Value) 가짐, 나머지 노드(인덱스 노드)들은 데이터를 위한 자식 포인터 즉, 인덱스(Key)만 가짐.
- 잎노드들은 LinkedList로 연결.
- 데이터 노드 크기는 인덱스 노드의 크기와 같지 않아도 됨.
B-Tree 예시
B+Tree 예시
B+Tree의 검색과정은 B-Tree와 동일. But 삽입 삭제는 항상 잎노드에서 일어나 차이가 있음
1) 삽입
(1) Key의 수가 최대보다 적은 잎노드에 삽입하는 경우
(2) Key의 수가 최대인 잎 노드에 삽입하는 경우
Key의 수가 최대이므로 삽입하는 경우 분할 해야함.
2) 삭제
(1) Key의 수가 최대보다 적은 잎노드에 삽입하는 경우
B-Tree와 동일한 방법으로 삭제
(2) Key의 수가 최대인 잎 노드에 삽입하는 경우
이 경우는 leaf node가 아닌 node에 key가 중복해서 존재한다. 따라서 해당 key를 노드보다 오른쪽에 있으면서 가장 작은 값으로 바꿔줘야 함.
참고
https://ddecode.tistory.com/entry/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4DB-4%EA%B4%80%EA%B3%84%ED%98%95-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4%EC%9D%98-%ED%82%A4key%EC%9D%98-%EC%A2%85%EB%A5%98?category=1019311
https://gyoogle.dev/blog/
https://incheol-jung.gitbook.io/docs/q-and-a/db/sql-vs-nosql
https://rebro.kr/167