JavaRush /Java Blog /Random-KO /개발자 인터뷰: 데이터베이스 질문 분석

개발자 인터뷰: 데이터베이스 질문 분석

Random-KO 그룹에 게시되었습니다
안녕하세요 여러분! 우리 모두는 Java 개발자가 되겠다는 하나의 목표를 위해 노력하고 있습니다 . 아마도 전문가가 되기 위한 가장 중요한 단계는 기술 면접일 것입니다. 일반적으로 면접관은 몇 가지 질문을 하면서 주요 주제를 살펴봅니다. 이 기사에서는 그러한 핵심 주제 중 하나인 데이터베이스에 대해 이야기하겠습니다 . 가장 자주 묻는 질문을 살펴보고 자료를 깊이 다루지 않고 대답해 봅시다. 이 경우 책의 양이 충분하지 않기 때문입니다! 자, 가자.개발자 인터뷰: 데이터베이스 질문 분석 - 1

1. 데이터베이스란 무엇입니까? 어떤 유형으로 나뉘나요?

DBMS란 무엇을 의미하나요?

개발자 인터뷰: 데이터베이스 질문 분석 - 2데이터베이스(DB)는 주로 대용량의 상호 관련된 정보를 저장, 변경 및 처리하도록 설계된 조직화된 구조입니다. 즉, 데이터베이스는 구조화된 데이터 저장소입니다. 예를 들어, 전화번호부.

데이터베이스 유형

  1. 관계형 데이터베이스는 사전 정의된 관계가 있는 데이터 모음입니다. 데이터는 열과 행으로 구성된 테이블 집합으로 저장됩니다. 테이블은 데이터베이스에 표시된 개체에 대한 정보를 저장합니다. 각 테이블 열은 특정 데이터 유형을 저장하고 각 셀은 속성 값을 저장합니다.
  2. 비관계형 시스템(NoSQL)은 유연한 스키마를 갖춘 특정 데이터 모델용으로 설계된 시스템입니다. 즉, 이는 표 형식, 행 및 열 형식이 아닌 다른 형식으로 데이터를 저장하는 데이터베이스입니다.
비관계형 데이터베이스에 대한 자세한 내용은 개발자를 위한 NoSQL 가이드 문서 에서 확인할 수 있습니다 . 데이터베이스 관리 시스템(DBMS)은 사용자가 데이터베이스(DB)를 생성하고 이에 대한 보완, 업데이트, 삭제, 선택 등의 다양한 작업을 수행할 수 있는 소프트웨어 집합입니다. DBMS는 데이터의 안전성, 무결성, 보안을 보장합니다. 저장하고 데이터베이스 관리에 대한 액세스 권한을 부여할 수 있습니다. 예를 들어, MySql은 관계형 데이터베이스에 대한 액세스를 제공하거나 비관계형 데이터베이스에 MongoDB를 제공하는 DBMS입니다.

2. 정규화란 무엇입니까? 정규화된 형태? 정규화에는 몇 가지 형태가 있나요? 처음 세 사람의 이름을 지정하십시오.

정규화 는 데이터베이스의 데이터를 구성하고 구조화하는 프로세스로, 중복성과 종속성의 불일치를 제거하여 더 큰 데이터베이스 유연성을 제공합니다. 정규형은 정규화의 맥락에서 고려되는 테이블의 속성으로, 구조의 단순성과 정확성 측면에서 테이블의 특징을 나타냅니다. 정규형은 테이블이 충족해야 하는 요구 사항 집합으로 정의됩니다. 총 6개의 정규형이 있지만 실제로는 처음 3개만 사용됩니다.
  1. 첫 번째 정규형:
    • 모든 속성은 단순합니다(즉, 원자적이고 분할할 수 없음).
    • 모든 데이터는 스칼라(즉, 양수)입니다.
    • 중복된 행이 없습니다(이를 위해 각 행마다 기본 키가 생성됩니다).
  2. 두 번째 정규형:
    • 첫 번째 정규형의 조건이 충족됩니다.
    • 키가 아닌 각 속성은 기본 키를 참조합니다.
  3. 세 번째 정규형:
    • 두 번째 일반 그룹의 조건이 충족됩니다.
    • 키가 아닌 필드는 다른 키가 아닌 필드와 독립적입니다. 기본 키에만 연결할 수 있습니다.

3. 비정규화

비정규화는 일반적으로 중복 데이터를 추가하여 데이터베이스에서 읽는 속도를 높이기 위해 데이터베이스 정규화 형태를 의도적으로 축소하거나 위반하는 것입니다. 일반적으로 이는 정규화와 반대되는 프로세스입니다. 이는 정규형 이론이 실제로 항상 적용 가능한 것은 아니기 때문에 발생합니다. 예를 들어, 비원자 값이 항상 "악"인 것은 아닙니다. 때로는 그 반대이기도 합니다. 경우에 따라 쿼리를 실행할 때, 특히 많은 양의 정보를 처리할 때 추가 조인이 필요할 수 있습니다. 이는 궁극적으로 성능을 향상시킬 수 있습니다. 분석용 데이터베이스는 쿼리 실행 속도를 높이기 위해 비정규화되는 경우가 많습니다. 예를 들어 키가 아닌 열이 서로 관련되는 보고서의 일부 데이터를 샘플링하는 경우가 많습니다. 샘플링의 용이성을 위해 의도적으로 세 번째 정규화 형식을 제거하고 모든 것을 하나의 테이블에 결합하므로 다른 테이블에 추가 쿼리를 수행할 필요가 없습니다.

4. 인덱스

인덱스는 데이터 검색 속도를 높이는 특정 열이 있는 테이블이나 뷰와 관련된 정렬된 값 집합입니다. 즉, 이것은 일종의 색인입니다. 전화번호부의 알파벳처럼 성으로 검색할 때 도움이 됩니다. 이 기능을 올바르게 사용하면 대규모 데이터베이스 작업 시 성능이 크게 향상될 수 있습니다. 아니면 많이 낮춰도 됩니다. 검색 속도를 높이기 위해 이러한 키는 검색이 수행되는 균형 잡힌 트리 구조에 저장됩니다. 원칙적으로 가장 많이 검색되는 필드에 색인을 입력해야 합니다. 최소 10,000개의 레코드가 있을 때보다 일찍 인덱스를 생성하는 것을 고려해야 합니다. 그렇지 않으면 조기 최적화가 EVIL 이기 때문에 눈에 띄는 결과를 볼 수 없습니다 . 그리고 인덱스가 시스템 성능에 어떤 영향을 미칠 수 있습니까? 새로운 데이터가 추가되거나 기존 데이터가 삭제되면 균형 트리 구조가 다시 계산됩니다. 실제로 데이터와 인덱스가 많아질수록 계산해야 할 트리도 많아집니다. 상황을 상상해 보십시오. 이 테이블에는 약 20,000개의 레코드와 7개의 인덱스가 있습니다. 즉, 데이터를 삽입할 때 각각 20,000개의 레코드가 있는 7개의 나무를 다시 계산해야 합니다. 엄밀히 말하면, 데이터가 자주 추가/삭제되는 테이블에는 인덱스를 사용하는 것은 전혀 권장되지 않습니다. null마지막으로, 값이 자주 발견되는 열에 대한 인덱스는 그다지 효과적이지 않으므로 그러한 열에 인덱스를 추가할 가치가 없다는 점에 유의하고 싶습니다 .

SQL에서 클러스터형 인덱스와 비클러스터형 인덱스의 차이점은 무엇입니까?

클러스터됨:

  • 선택한 필드에 대한 물리적 순서를 제공합니다.
  • 테이블에 클러스터형 인덱스가 있으면 클러스터형이라고 합니다.
  • 테이블당 하나 이상의 인덱스가 필요하지 않습니다.
  • MySQL에서 클러스터형 인덱스는 사용자가 명시적으로 지정하지 않습니다. 테이블에 PRIMARY KEY를 정의하지 않으면 MySQL은 UNIQUE모든 키 열이 있는 첫 번째 인덱스를 찾고 NOT NULLInnoDB는 이를 클러스터형 인덱스로 사용하기 때문입니다.

비클러스터형:

  • 테이블당 최대 999개의 비클러스터형 인덱스가 가능합니다.
  • 테이블의 실제 데이터가 있는 행에 대한 포인터를 포함합니다.
  • 물리적 주문을 제공하지 않습니다.
  • 비클러스터형 인덱스의 경우 정렬된 데이터가 있는 별도의 테이블, 즉 인덱스가 위치한 하나의 열에 대해 하나의 테이블이 있으므로 해당 필드에 속하지 않는 데이터를 요청할 때 쿼리는 먼저 해당 필드에서 수행됩니다. 필드를 입력한 다음 원래 테이블의 행에 대한 추가 쿼리를 수행합니다.
비클러스터형 인덱스 만들기:
CREATE INDEX index_name ON table_name(column_name)

6. 종합지수란 무엇인가요?

복합 인덱스 - 동시에 여러 열에 전송하여 구축되었습니다. 즉, 여러 개의 컬럼으로 구성된 복합 인덱스입니다. 이러한 인덱스는 하나의 쿼리에 둘 이상의 열이 나타날 때 사용됩니다. 복합 색인 만들기:
CREATE INDEX index_name ON table_name(first_column_name, second_column_name, third_column_name)
일반적으로 이러한 인덱스는 여러 열의 데이터가 논리적으로 관련되어 있는 경우에 사용됩니다.

7. 커버링지수란 무엇인가요? 고유 인덱스?

커버링 인덱스는 테이블 자체에 액세스하지 않고도 쿼리에 응답하기에 충분한 인덱스입니다. 이 인덱스를 사용하면 전체 데이터 행을 얻을 수 있지만 실제로는 이것이 꼭 필요한 것은 아닙니다. 소스 테이블로 직접 이동할 필요가 없고 인덱스만 사용하여 응답할 수 있으므로 포함 인덱스를 사용하는 것이 약간 더 빠릅니다. 동시에, 열이 많을수록 인덱스 자체가 더 번거롭고 느려진다는 점을 잊지 마십시오. 그러므로 이것을 남용해서는 안 됩니다. 위에서 우리는 고유 할 수 있는 클러스터형 인덱스와 비클러스터형 인덱스에 대해 이야기했습니다 . 이는 두 필드가 인덱스 키에 대해 동일한 값을 갖지 않음을 의미합니다. 그렇지 않으면 여러 행에 동일한 값이 포함될 수 있으므로 인덱스가 고유하지 않습니다. 고유한 비클러스터형 인덱스를 만드는 예:
CREATE UNIQUE INDEX index_name ON table_name(column_name)

8. 기본 키란 무엇입니까?

기본 키 는 데이터베이스 테이블의 각 행을 식별하는 테이블의 필드입니다. 테이블에는 이러한 필드가 하나만 있을 수 있으며 모든 값은 고유해야 합니다. 아무것도 생각나지 않나요? 개발자 인터뷰: 데이터베이스 질문 분석 - 3결국 기본 키는 고유한 클러스터형 인덱스에 지나지 않습니다. 일반적으로 테이블을 생성할 때 기본 키가 생성됩니다.
CREATE TABLE table_name(
column_name int PRIMARY KEY,..)
이 열에 제한사항이 자동으로 추가됩니다 NOT NULL. 이미 생성된 테이블에 대한 키를 설정할 수도 있습니다.
ALTER TABLE table_name ADD PRIMARY KEY (column_name);
위에서 설명한 방식으로 기본 키가 추가되면 기본 키( column_name)로 지정된 필드의 값에 null 값이 포함되어 있지 않은지 확인합니다(제약 조건도 추가됩니다 - NOT NULL).

외래 키란 무엇입니까?

외래 키는 테이블 간의 관계를 제공하기 위해 생성되는 속성입니다. 일반적으로 외래 키는 하위 테이블의 열에 설정되며 기본 테이블의 열 중 하나를 가리킵니다. 테이블을 생성할 때 다음과 같이 지정할 수 있습니다.
CREATE TABLE table_name{
column_name int,..
FOREIGN KEY(column_name) REFERENCES another_table_name(another_table_column_name) }
따라서 테이블을 생성한 후:
ALTER TABLE table_name
ADD FOREIGN KEY(column_name) REFERENCES another_table_name(another_table_column_name));
참조하는 필드를 조작할 때 외래 키의 동작을 설정할 수 있습니다. ON DELETE조작 유형 은 다음과 같습니다 ON UPDATE. 가능한 동작 옵션:
  • CASCADE— 이 속성을 사용하면 기본 테이블에서 관련 행이 삭제되거나 변경될 때 종속 테이블의 행이 자동으로 삭제되거나 변경됩니다.
  • SET NULL— 이 속성을 사용하면 관련 행이 기본 테이블에서 삭제되거나 업데이트될 때 NULL외래 키 열의 값이 설정됩니다.
  • NO ACTION— 종속 테이블에 관련 행이 있는 경우 기본 테이블의 행을 삭제하거나 변경하려는 시도를 거부합니다.
  • RESTRICT- NO ACTION;
  • SET DEFAULT- 이 속성을 사용하면 관련 행이 기본 테이블에서 삭제되거나 업데이트될 때 외래 키 열의 기본값(있는 경우)이 설정됩니다.
사용 예:
CREATE TABLE table_name{
column_name int,..
FOREIGN KEY(column_name) REFERENCES another_table_name(another_table_column_name) ON UPDATE CASCADE ON DELETE CASCADE }
ON DELETE및 에 대한 동작이 명시적으로 설정되지 않은 경우 ON UPDATE해당 동작은 으로 설정됩니다 RESTRICT.

10. 테이블 간 연결(Join) 유형

테이블 간의 연결은 공통 데이터(필드)를 기반으로 제공됩니다. 이는 한 테이블의 행을 다른 테이블의 행과 일치시키는 작업인 연산자를 사용하여 발생합니다 JOIN. 별도의 테이블에서 얻을 수 있지만 두 테이블의 열이 인접하도록 매핑이 수행됩니다. 그리고 세 테이블에 대한 공통 필드가 있는 경우 해당 데이터를 하나의 공통 테이블로 표시할 수 있습니다. 그러나 조인되는 테이블 수가 적을수록 쿼리 실행 속도가 빨라진다는 점을 고려해 볼 가치가 있습니다. 따라서 유형은 다음과 같습니다 JOIN.
  • INNER JOIN- 두 번째 테이블의 일부 데이터에 해당하는 첫 번째 테이블의 데이터만 표시하는 연결입니다. 나머지는 내려갑니다.개발자 인터뷰: 데이터베이스 질문 분석 - 4
  • LEFT JOIN- 첫 번째 테이블의 모든 데이터와 두 번째 테이블의 해당 데이터(있는 경우)를 표시하는 연결입니다. 해당 데이터가 없으면 두 번째 테이블의 데이터 필드는 비어 있습니다.개발자 인터뷰: 데이터베이스 질문 분석 - 5
  • RIGHT JOIN- 두 번째 테이블의 모든 데이터와 첫 번째 테이블의 해당 데이터(있는 경우)를 표시하는 연결입니다. 해당 데이터가 없으면 첫 번째 테이블의 데이터 필드는 비어 있습니다.개발자 인터뷰: 데이터베이스 질문 분석 - 6
  • FULL JOIN- 첫 번째 테이블과 두 번째 테이블의 모든 데이터를 표시하는 연결입니다. 다른 테이블에 관련 데이터가 없으면 해당 데이터의 필드는 비어 있게 됩니다.개발자 인터뷰: 데이터베이스 질문 분석 - 7
  • CROSS JOIN- 첫 번째 테이블의 각 행이 두 번째 테이블의 각 행(각각)에 조인되는 교차 조인입니다. 즉, 두 테이블에 각각 3개의 행이 있는 경우 이 조인 후에는 9개의 행 결과를 얻게 됩니다.개발자 인터뷰: 데이터베이스 질문 분석 - 8
Join(inner):
SELECT *
FROM first_table
INNER JOIN second_table ON first_table.some_column = second_table.some_column

11. 데이터베이스의 ACID 속성이란 무엇입니까?

A - 원자성(Atomicity)은 트랜잭션이 시스템에 부분적으로 커밋되지 않도록 합니다. 모든 하위 작업이 수행되거나 전혀 수행되지 않습니다. 예를 들어, 은행에서 다른 계좌로 돈을 이체하려면 다음 두 가지 작업이 필요합니다.
  1. 은행 계좌로 돈을 이체하세요.
  2. 은행 계좌에서 특정 계좌로 돈을 이체합니다.
그러나 어떤 일이든 일어날 수 있습니다. 예를 들어 은행에 갔는데 오류가 발생하고 두 번째 작업이 완료되지 않습니다. 또는 그 반대의 경우도 있습니다. 두 번째 작업만 수행됩니다. 따라서 이러한 작업은 하나의 트랜잭션 내에서 수행되며 결과는 전부이거나 전무입니다. C - 일관성 : 성공적인 각 트랜잭션은 항상 해결 가능한 결과만 기록합니다. 이렇게 하면 모든 제한 사항(예: NOT NULL)이 충족됩니다. 그렇지 않으면 트랜잭션이 롤백됩니다. 그리고 - 격리 : 트랜잭션 실행 중에 병렬 트랜잭션이 결과에 영향을 주어서는 안 됩니다. 이를 통해 모든 사람에게 데이터의 최종 상태가 아닌 상태를 숨길 수 있는 기능이 제공됩니다. 실제로 이것이 실패한 트랜잭션이 어떤 것도 깨뜨릴 수 없는 이유입니다. 조금 더 낮게 우리는 트랜잭션 격리 수준에 대해 알게 될 것입니다. D - 지속성 : 트랜잭션이 완료되면 일부 오류로 인해 변경 사항이 취소되지 않는다는 것을 확신할 수 있습니다.

12. 거래 격리 수준

각 격리 수준은 특정 작업(기회)을 허용/금지합니다.
  • 팬텀 읽기 - 동일한 트랜잭션 내에서 동일한 데이터 요청이 다른 결과를 제공합니다. 이는 다른(병렬) 트랜잭션에 의한 데이터 추가로 인해 발생합니다.
  • 비반복 읽기 - 동일한 트랜잭션 내에서 동일한 데이터 요청이 다른 결과를 제공합니다. 이는 다른(병렬) 트랜잭션에 의한 데이터 변경 또는 삭제로 인해 발생합니다.
  • "더티" 읽기 - 나중에 롤백되지 않는 트랜잭션에 의해 추가되거나 변경된 데이터를 읽는 것입니다.
  • 업데이트 손실 - 서로 다른 트랜잭션이 동일한 데이터 블록을 동시에 변경하면 마지막 변경 사항을 제외한 모든 변경 사항이 손실됩니다(멀티스레딩의 "경합 조건"과 유사).
편의를 위해 표에서 격리 수준과 해당 기능을 고려합니다.
절연 수준 환상의 독서 비반복 읽기 "더러운" 읽기 업데이트 손실
직렬화 가능 + + + +
REPEATABLE_READ - + + +
READ_COMMITTED - - + +
READ_UNCOMMITTED - - - +

13. SQL 인젝션이란 무엇입니까?

SQL 인젝션은 웹사이트를 해킹하는 방법 중 하나이며, 그 핵심은 GET쿼리 POST나 쿠키를 통해 일부 SQL 코드를 데이터에 주입하는 것입니다. 웹사이트에서 이러한 주입을 수행하면 데이터베이스에 접근하여 애플리케이션을 해킹할 수 있습니다. 예를 들어, 우리는 어떤 변수의 이름을 알고 있습니다. column_nametype 으로 가정해 봅시다 boolean. 시스템이 주입에 취약한 경우 OR column_name=true데이터베이스에서 필요한 모든 것을 추가하고 쓸 수 있습니다. OROR 조건을 생성하고 그 이후의 표현식은 항상 가 되어 true더 많은 작업을 수행하게 됩니다. SQL 인젝션과 같은 웹사이트 공격은 SQL 쿼리에 사용되는 수신 데이터의 부적절한 처리로 인해 발생할 수 있습니다. JDBC를 사용하여 데이터베이스에 연결할 때 다양한 Statements. PreparedStatement보안을 강화하려면 일반적인 것 대신에 사용해야 하는데 Statement, 사용하면 Statement단순히 쿼리 문자열과 값을 합산해 주입이 가능하기 때문이다. 차례로 PreparedStatement특정 요청 템플릿이 있으며 데이터는 따옴표가 반영된 상태로 삽입됩니다. 결과적으로 SQL 주입은 일부 필드의 문자열 표현으로만 인식됩니다. SQL 주입을 방지하기 위해 정규식 기반 검사를 사용할 수 있습니다( 이 기사에서 정규식에 대한 자세한 내용을 읽을 수 있습니다 ). Собеседование разработчика: разбор вопросов по базам данных - 9또 다른 옵션은 수신 매개변수의 문자 수에 대한 제한을 설정하는 것입니다. 예를 들어, 9999 이하의 숫자를 수신해야 하는 경우 수신 문자 수는 4개로 제한됩니다. SQL 주입을 사용한 해킹 위험을 줄여줍니다. "Java 보안: 모범 사례" 기사에서 Java 보안에 대해 자세히 알아볼 수 있습니다 .

14. 저장 프로시저란 무엇입니까? 저장된 기능? 방아쇠?

SQL의 저장 프로시 저는 한 번 컴파일되어 서버에 저장되는 SQL 명령 집합인 데이터베이스의 엔터티입니다. 한마디로 이것은 Java의 메소드와 유사합니다. 저장 프로시저는 일반 쿼리와 일반 쿼리에 사용할 수 없는 일부 작업을 모두 데이터에 대해 수행할 수 있습니다. 프로시저는 한 번 생성된 후 인수를 전달하여 호출되는 SQL 엔터티입니다. 이 접근 방식의 장점은 이러한 명령어를 두 번 이상 재사용할 수 있다는 것입니다. 저장 프로시저는 성능을 향상시키고 프로그래밍 기능을 강화하며 데이터 보안 기능을 지원합니다. 프로시저 생성을 고려해 보겠습니다.
CREATE PROCEDURE procedure_name (first_param some_type, second_param some_type..)
 begin
……...
 end
프로시저 호출:
CALL procedure_name (first_param, second_param…..);
저장 함수는 저장 프로시저의 한 유형입니다. 함수의 차이점은 항상 단일 값만 반환하는 반면 프로시저는 항상 일련의 값을 반환한다는 것입니다. 저장 프로시저는 일반 SQL과 혼합될 수 없지만 저장 함수는 혼합될 수 있으며 이것이 장점입니다. 반면에 저장 함수에는 프로시저보다 더 많은 제한이 있습니다. 저장 함수 만들기:
CREATE FUNCTION function_name (first_param, second_param…..)
RETURNS some_type
 begin
……...
RETURN some_value;
end
저장된 함수 호출:
SELECT function_name(first_param, second_param…..);
트리거는 사용자가 직접 호출하지 않지만 데이터가 수정될 때 활성화되는 또 다른 유형의 저장 프로시저입니다. 즉, 이 프로시저는 특정 테이블의 특정 열에 있는 데이터, INSERT또는 DELETE과 같은 특정 조건이 충족될 때 활성화됩니다. UPDATE트리거가 실행되는 시기는 키워드 BEFORE(관련 이벤트 이전에 트리거가 실행됨) 또는 AFTER(이벤트 이후)를 사용하여 결정됩니다.
CREATE TRIGGER trigger_name
ON table_name
AFTER INSERT
 begin
……...
 end

15. 연습

그렇더라도 인터뷰에서 가장 일반적인 SQL 질문은 연습, 즉 문제 해결입니다. 모든 것이 상대방의 상상력의 정교함에 달려 있기 때문에 어떤 작업을 수행하게 될지 추측하는 것은 의미가 없습니다. 따라서 유일한 작업 옵션은 다양한 복잡성의 SQL 쿼리를 더 잘 수행하는 것입니다. sql-ex.ru는 다양한 작업을 연습하기 위한 리소스 역할을 할 수 있습니다 . 처음 20개의 작업을 완료한 후에는 대담자가 SQL 작업으로 당신을 놀라게 하는 것이 매우 어려울 것입니다. Собеседование разработчика: разбор вопросов по базам данных - 11오늘은 여기까지입니다. 이 기사를 읽은 후에는 데이터베이스에 대한 질문으로 인해 어려움이나 문제가 발생하지 않기를 바랍니다. 많은 관심 부탁드리며 또 뵙겠습니다!
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION