데이터의 정확성 또는 유효성을 의미한다.
개체 무결성
릴레이션에서 기본키를 구성하는 요소는 Null 값이나 중복값을 가질 수 없다.
[학생] 릴레이션에서 ‘학번’을 기본키로 지정했다면 ‘학번’ 속성은 NULL이 되어서는 안된다.
참조 무결성
외래키 값은 Null 값이나 참조하는 릴레이션의 기본키 값과 동일해야한다.
즉, 각 릴레이션은 참조할 수 없는 외래키를 가질수 없다.
[수강] 릴레이션에서 ‘학번’ 속성에는 [학생] 릴레이션의 ‘학번’ 속성에 없는 값은 입력할 수 없다.
도메인 무결성
속성들의 정의된 값은 도메인에 속한 값이어야한다.
‘성별’이라는 속성에서 ‘남’, ‘여’를 제외한 데이터는 제한되어야 한다.__
고유 무결성
특정 속성에 대해 고유한 값을 가지도록 조건이 주어진 경우, 릴레이션의 각 튜플이 가지는 속성 값들은 서로 달라야 합니다.
[학생] 릴레이션에서 ‘이름’, ‘나이’는 서로 같은 값을 가질 수 있지만 ‘학번’의 경우, 각 튜플은 서로 다른 값을 가져야 한다.
NULL 무결성
릴레이션의 특정 속성은 NULL이 될 수 없다.
[학생] 릴레이션 정의 시 ‘과목’ 속성에 NULL 값이 올 수 없도록 제한했다면 ‘과목’ 속성에 NULL이 있어서는 안된다.
키 무결성
각 릴레이션은 최소한 한 개 이상의 키가 존재해야 합니다.
참고 : https://iingang.github.io/posts/DB-Integrity-constraint/
인덱스는 데이터베이스에서 조회 및 검색을 더 빠르게 할 수 있는 방법/기술, 혹은 이에 쓰이는 자료구조를 의미하기도 한다. 하지만 데이터 저장/수정/추가에는 더 오래걸린다. 결론적으로 DBMS에서 인덱스는 데이터의 저장 성능을 희생하고, 그 대신 데이터의 읽기 속도를 높이는 기능이다.
B+-Tree
일반적으로 인덱스에 쓰이는 알고리즘은 B+Tree 알고리즘이다.B+-Tree 인덱스는 칼럼의 값을 변형하지 않고(사실 값의 앞부분만 잘라서 관리한다.), 원래의 값을 이용해 인덱싱하는 알고리즘이다.
Hash 인덱스 알고리즘
칼럼의 값으로 해시 값을 계산해서 인덱싱하는 알고리즘으로 매우 빠른 검색을 지원한다. 하지만 값을 변형해서 인덱싱하므로, 특정 문자로 시작하는 값으로 검색을 하는 전방 일치와 같이 값의 일부만으로 검색하고자 할 때는 해시 인덱스를 사용할 수 없다. 주로 메모리 기반의 데이터베이스에서 많이 사용한다.
왜 index를 생성하는 B+tree 알고리즘을 생성하는가?
데이터를 접근하는 속도가 O(1)인 hash 인덱스 알고리즘이 더 효율적일 것 같지만, 쿼리문에서 범위를 한정하는 부등호도 포함된다. hash 알고리즘을 사용하면 등호(=)연산이 아닌 부등호연산을 사용하면, 문제가 발생한다. 따라서 등호(=)연산에 특화된 hashtable은 적합하지 않다.
RDBMS의 특징
• 데이터는 정해진 데이터 스키마에 따라 테이블에 저장된다.
• 데이터는 관계를 통해 여러 테이블에 분산된다.
RDBMS의 장점
• 명확하게 정의된 스키마, 데이터 무결성 보장
• 관계는 각 데이터를 중복없이 한번만 보장
RDBMS의 단점
• 덜 유연함, 데이터 스키마를 사전에 계획하고 알려야한다.(나중에 수정하기 힘듦)
• 관계를 맺고 있어서 조인문이 많은 복잡한 쿼리가 만들어질 수 있다.
• 대체적으로 수직적 확장만 가능하다.
NOSQL의 특징
• 스키마, 관계가 존재하지않는다.
• RDBMS는 정해진 스키마에 따르지 않으면 데이터 추가가 불가능했지만, NoSQL은 다른 구조의 데이터를 같은 컬렉션에 추가가 가능하다.
NOSQL의 장점
• 스키마가 없어서 유연하다. 언제든지 저장된 데이터를 조정하고 새로운 필드 추가 가능하다
• 데이터는 어플리케이션이 필요한 형태로 저장되어 읽어올때 속도가 빠르다.
• 수직 및 수평 확장이 가능해서, 어플리케이션이 발생하는 모든 읽기/쓰기 요청 처리 가능하다.
NOSQL의 단점
• 유연성으로 인해 데이터 구조 결정을 미룰 수 있다.
• 데이터의 중복을 계속 업데이트 해야한다.
• 데이터가 여러 컬렉션에 중복되어 있을 경우, 수정 및 변화가 필요할 때 모든 컬렉션에 대해서 업데이트를 해야한다.
RDBMS 사용이 더 좋을 때
• 관계를 맺고 있는 데이터가 자주 변경되는 어플리케이션 같은 경우
• 변경될 여지가 없고, 명확한 스키마가 사용자와 데이터에게 중요한 경우
NOSQL 사용이 더 좋을 때
• 정확한 데이터 구조를 알 수 없거나, 변경/확장 될 수 없는 경우
• 데이터베이스를 수평적으로 확장해야하는 경우 (막대한 양의 데이터를 처리 해야할 경우)
• 읽기는 자주하지만, 데이터 변경은 자주 없는 경우
트랜잭션은 작업의 완전성을 보장해주는 것 이다. 즉, 논리적인 작업 셋을 모두 완벽하게 처리하거나 또는 처리하지 못하는 경우,원 상태로 복구해서 일부만 반영되는 현상이 발생하지 않게 해주는 기능이다.
• 원자성 (Atomicity)
만약 트랜잭션 중간에 어떠한 문제가 발생했다면 트랜잭션에 해당하는 어떠한 작업 내용도 수행되서는 안되며, 문제가 발생하지 않았을 경우에만 모든 작업이 수행되어야 한다.
• 일관성 (Consistency)
트랜잭션이 완료된 이후에도, 트랜잭션이 일어나기 이전의 상황과 동일하게 데이터의 일관성이 보장되어야 한다.
• 고립성 (Isolation)
각각의 트랜잭션은 서로의 간섭없이 독립적으로 실행되어야 한다.
• 지속성 (Durability)
트랜잭션이 정상적으로 완료되었을 경우엔 영구적으로 데이터베이스에 작업의 결과가 저장되어야 한다.
참고:
https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/Database#transaction
https://github.com/jjuyeon/Tech-Interview-Study/tree/main/database
https://github.com/MangKyu/tech-interview-for-developer/blob/master/Computer%20Science/Database/SQL%EA%B3%BC%20NOSQL%EC%9D%98%20%EC%B0%A8%EC%9D%B4.md