728x90
반응형
최대한 1분 내외로 맞추려고 노력 중이다. 음 사실 오늘 하루만에 밑에 걸 다한 건 아니고 TIL만 안 쓰고 며칠동안 공부한 거 한꺼번에 적은 거다. 모르는 게 많아 한 두개 하는 것도 아직은 많은 시간을 필요로 한다.
- Primary key와 Foreign key
- 프라이머리 키는 유일한 값으로써 데이터를 식별한다.
- 포린키는 테이블끼리 관계짓기 위해 참조하는 키로, 다른 테이블의 데이터를 식별할 수 있다.
- 프라이머리 키는 테이블 내에 반드시 하나만 존재해야 하지만, 포린키는 두 개 이상 존재해도 된다.
- 프라이머리 키의 경우 상위 테이블에서 해당 값을 삭제할 수 없는 반면, 포린키는 상위 테이블에서 해당 값을 삭제할 수 있습니다.
- 프라이머리키는 암묵적으로 임시 테이블에서 정의될 수 있지만 포린키는 임시 테이블에서 정의될 수 없다는 차이점도 존재합니다.
- 포린키를 사용할 경우 같은 정보를 반복해서 저장하는 일을 방지함으로써 메모리 낭비를 막을 수 있고, 참조 무결성의 원칙을 지킬 수 있다.
- 그리고 이때 on_delete 옵션을 사용할 수 있는데, 나는 주로 CASCADE를 많이 썼다.
- 포린키 예시 : 과목 테이블과 학생 테이블이 있다고 할 때 두 테이블을 연결지어 특정 학생이 수강신청한 강의를 참조할 수 있다.
- 프라이머리키는 null값을 허용하지 않지만, 포린키는 null값이 가능하다.
- 트랜잭션과 ACID
- 데이터베이스와 한 번 상호작용하는 단위. 디비에서 수행되는 작업의 최소 단위. 디비의 무결성을 유지하면서 상태를 변화시키는 것.
- 트랜잭션은 원자성, 일관성, 격리성, 지속성의 원칙을 지켜야 한다.
- 원자성 : 트랜잭션의 연산이 데이터베이스에 모두 반영되든지 아니면 전혀 반영되지 않아야 한다
- 일관성 : 트랜잭션의 작업 처리 결과가 항상 일관적이어야 한다. 즉 중간에 데이터베이스가 변경되더라도 업데이트된 데이터베이스로 트랜잭션이 진행되는 게 아니라 처음에 트랜잭션을 진행하기 위해 참조한 데이터베이스로 진행되어야 한다.
- 격리성 : 둘 이상의 트랜잭션이 동시에 실행되고 있을 경우 어떤 하나의 트랜잭션이라도 다른 트랜잭션의 연산에 끼어들 수 없다.
- 지속성 : 완료된 트랜잭션은 데이터베이스에 영구적으로 보존되어야 한다.
- 독립성이 지켜지지 않은 상태를 경쟁 상태(race condition)라고 한다. 두 개 이상의 트랜잭션이 하나의 자원을 바꾸려고 하는 것.
- 독립성이 보장되지 않으면 deadlock은 무조건 발생하고, 보장되면 발생 확률이 매우 낮아진다. 아예 없어지는 건 아니다. deadlock 발생 이유에 독립성이 지켜지지 않은 것만 있는 게 아니기 때문.
- Deadlock과 해결 방안
- 락이 걸려야 요청 순서대로 처리되고, 데이터가 오염되지 않는다.
- 하지만 트랜잭션이 경쟁 상태에 돌입하면 리소스를 얻지 못하고 무한 대기에 빠지게 되는데 이러한 상황을 데드락, 다른 말로 교착 상태라고 한다.
- 데드락이 발생하는 네 가지 조건이 존재하는데, 이 모든 조건이 동시에 성립할 때 데드락이 발생하므로 데드락을 해결할 수 있고, 이를 예방법이라고 한다.
- 또는 데드락 발생 시 데드락을 회피하는 회피법이 존재하는데, 가장 대표적인 게 은행원 알고리즘이다.
- 교착 상태가 되도록 허용한 다음 탐지 기법을 통해 데드락 발생 여부를 조사하고 회복 기법을 통해 순환 대기에서 벗어남으로써 데드락을 해결하는 방법이 존재한다. ex) 타조 알고리즘
- 데드락 발생 조건 4개
- 상호 배제 조건 : 하나의 리소스는 하나의 프로세스만 사용할 수 있다.
- 점유 대기 조건 : 이미 하나의 리소스를 가진 상태에서 다른 프로세스에 할당된 자원을 점유하기 위해 대기중인 프로세스가 존재한다.
- 비선점 조건 : 이미 점유된 자원을 강제로 빼앗을 수 없다.
- 순환 대기 조건 : 대기중인 프로세스의 집합이 순환하는 형태로 자원을 대기하고 있어야 한다.
- Join의 뜻과 inner join vs. left outer join
- Join은 두 테이블의 공통된 key값을 기준으로 테이블을 연결해 한 테이블처럼 보는 것.
- inner join은 join하려는 테이블 간 교집합에 해당하는 데이터를 조회할 때 사용
- outer join, 그 중에서도 left outer join의 경우 테이블 간 교집합과 더불어 from 절에 명시한 테이블에만 존재하는 데이터를 보여주기 때문에 작성 순서가 중요하게 작용한다.
- inner join은 합치된 값이 없으면 결과에 반영하지 않는 반면, outer join은 null값으로 처리해 반영한다.
- 예시 들어서 설명하기!
- 하지만 만약 inner join과 left join의 결과가 같을 경우, inner join을 하는 컬럼에 인덱스가 걸려 있어 hash match 전략에 최적화되어있다면 시간복잡도가 낮은 inner join을 사용하는 것이 좋다.
- 시간복잡도 : inner join은 O(n) / left join은 O(n^2)
반응형
'Programming > TIL and WIL' 카테고리의 다른 글
| TIL : DFS & BFS, 완전탐색 활용 알고리즘 문제 (0) | 2023.01.18 |
|---|---|
| TIL : 모의면접 스터디, 알고리즘 공부, 쿠키와 세션, OSI 7계층 (0) | 2023.01.17 |
| 220104 TIL : ChatGPT 추가 조사 (0) | 2023.01.05 |
| TIL Today I Learned : Dall-E2와 ChatGPT (0) | 2023.01.03 |
| Weekly I Learned (0) | 2023.01.01 |