데이터베이스 예상질문 10선

이상훈·2023년 7월 26일
1

CS

목록 보기
15/27

1. 후보키, 기본키, 대체키, 슈퍼키, 외래키에 대해 설명해주세요.

  • 후보키 : 유일성 + 최소성을 만족
  • 기본키 : 튜플을 식별하기 위해 특별히 선택된 키, 후보키 중 하나 선택
  • 대체키 : 기본키로 선택되지 않은 나머지 후보키
  • 슈퍼키 : 유일성은 만족 But 최소성은 만족 X
  • 외래키 : 다른 테이블의 기본키를 참조하는 키

2. SQL Injection이 무엇인지와 방어 및 방지하기 위한 대책을 설명해주세요.

  • 개념 : SQL Injection이란 공격자가 악의적인 의도를 갖는 SQL 구문을 삽입하여 데이터베이스를 비정상적으로 조작하는 공격 기법을 의미한다.
  • 대책 :
    • Prepared Statement 사용
      • Prepared Statement : SQL 구문이 미리 컴파일 되어 있어 입력값을 변수로 선언해 두고 필요에 따라 값을 대입하여 처리하는 방식. 따라서 변수에 sql 구문이 들어가도 이미 컴파일 되어 있기 때문에 상관 없음.
    • 입력값을 검증하는 로직 추가
      • 검증하는 로직은 블랙리스트 기반이 아닌 화이트리스트 기반

💡 SQL Injection 보안대책


3. RDBMS와 NoSQL은 어느 경우에 적합한가요?

  • RDBMS :
    • 관계를 맺고 있는 데이터가 자주 변경되는 애플리케이션의 경우
      • NoSQL에서는 여러 컬렉션을 모두 수정해야 하기 때문에 비효율적
    • 변경될 여지가 없고, 명확한 스키마가 사용자와 데이터에게 중요한 경우
  • NoSQL :
    • 정확한 데이터 구조를 알 수 없거나 변경/확장 될 수 있는 경우
    • 읽기를 자주 하지만, 데이터 변경은 자주 없는 경우
    • 데이터베이스를 수평으로 확장해야 하는 경우
      • 막대한 양의 데이터를 다뤄야 하는 경우

4. 이상 현상의 종류에 대해 설명해주세요.

  • 삽입 이상 : 자료를 삽입할 때 특정 속성에 해당하는 값이 없어 NULL을 입력해야 하는 현상
  • 갱신 이상 : 중복된 데이터 중 일부만 수정되어 데이터 모순이 일어나는 현상
  • 삭제 이상 : 어떤 정보를 삭제하면, 의도하지 않은 다른 정보까지 삭제되어버리는 현상

5. 제1,2,3 정규화에 대해 설명해주세요

  • 제 1정규형 : 테이블의 컬럼이 원자값을 갖도록 분해
  • 제 2정규형 : 제 1정규형을 만족하고 완전함수 종속을 만족하도록 분해
  • 제 3정규형 : 제 2정규형을 만족하고 이행적 함수 종속을 없애도록 분해

6. 어떤 컬럼에 Index를 설정해야 할까?

  • 카디널리티가 높은 컬럼

    • 카디널리티가 높다 == 값들이 대부분 다른 값을 가짐
  • 조회 활용도가 높은 컬럼

    • ex) where절의 대상 컬럼
  • 수정 빈도가 낮은 컬럼

    • 인덱스로 지정된 컬럼의 값이 바뀌게 되면 인덱스 테이블도 새롭게 갱신되야 함

    💡 효과적인 DB index 설정하기


7. Clustered Index vs Non Clustered Index

Clustered Index

  • 실제 데이터 자체가 정렬
  • 테이블당 1개만 존재 가능
  • 리프 페이지가 데이터 페이지
  • Primary key는 자동으로 cluster index
  • 비유하자면 페이지를 알기 때문에 바로 그 페이지를 펼치는 것

Non Clustered Index

  • 실제 데이터 페이지는 그대로
  • 별도의 인덱스 페이지 생성 -> 추가 공간 필요
  • 테이블당 여러 개 존재
  • 리프 페이지에 클러스터링 인덱스가 적용된 컬럼의 실제 값을 담고 있음
  • create index ~~로 직접 index를 생성하면 non clustered index가 생성됨
  • 목차에서 찾고자 하는 내용의 페이지를 찾고 그 페이지로 이동하는 것

💡💡 [10분 테코톡] 라라, 제로의 데이터베이스 인덱스


8. MySQL에서 성능 확인을 위한 명령어와 실행시 결과값 중 어떤 값을 잘 봐야하는가?

EXPLAIN : 이 명령어는 쿼리 실행 계획을 분석하여 어떻게 쿼리가 수행되는지 확인할 수 있다.

  • type : 테이블의 접근 방식을 나타낸다. "All"이나 "full scan"은 인덱스를 사용하지 않고 모든 행을 스캔하는 것이므로 성능 문제가 발생할 수 있다.
  • key : 사용된 인덱스를 나타낸다.
  • rows : 테이블에서 읽어야 할 행의 수를 나타낸다. 높은 값은 성능 문제를 암시할 수 있다.
  • extra : 추가 정보를 제공한다. 예를 들어 "Using where"는 where 절에서 추가적인 필터링이 발생함을 의미한다.

9. 트랜잭션 격리 수준에 대해 설명해주세요

트랜잭션 격리 수준이란 동시에 DB에 접근할 때 그 접근을 어떻게 제어할지에 대한 설정.
Read-uncommited : 커밋 전의 트랜잭션의 데이터 변경 내용을 다른 트랜잭션이 읽는 것 허용.
Read-commited : 커밋이 완료된 트랜잭션의 변경사항만 다른 트랜잭션에서 조회 가능
Repeatable-read : 트랜잭션 범위 내에서 조회한 내용이 항사 동일함을 보장.
SERIALIZABLE : 한 트랜잭션에서 사용하는 데이터를 다른 트랜잭션에서 접근 불가.

💡💡 [10분 테코톡] 🌼 예지니어스의 트랜잭션


10. 데이터베이스 view란?

개념 : 직접 테이블에 접근하는 것이 아니라 테이블에서 사용자가 필요로 하는 부분만 선택하여 만들어 놓은 데이터 집합이다. 일종의 가상 테이블이라고 생각하면 된다.
장점 : 원본 테이블에 직접 접근하지 않아도 사용자가 임의의 뷰를 구성하여 별도의 이름을 붙이거나 접근 가능한 사람을 지정해줄 수 있어서 사용자 편의성과 데이터베이스의 보안 측면에서 좋다.

profile
Problem Solving과 기술적 의사결정을 중요시합니다.

0개의 댓글