간단한 데이터베이스 엔진을 작성하는 방법


143

데이터베이스 엔진의 작동 방식 (예 : 내부 엔진)을 배우고 싶습니다. CS에서 가르치는 대부분의 기본 데이터 구조 (트리, 해시 테이블, 목록 등)와 컴파일러 이론에 대한 잘 이해하고 (매우 간단한 해석기를 구현했습니다.)가는 방법을 이해하지 못합니다. 데이터베이스 엔진 작성에 대해 주제에 대한 자습서를 검색했지만 찾을 수 없으므로 다른 사람이 나를 올바른 방향으로 안내 할 수 있기를 바랍니다. 기본적으로 다음에 대한 정보를 원합니다.

  • 데이터가 내부적으로 저장되는 방법 (예 : 테이블이 표시되는 방법 등)
  • 엔진이 필요한 데이터를 찾는 방법 (예 : SELECT 쿼리 실행)
  • 빠르고 효율적인 방식으로 데이터를 삽입하는 방법

그리고 이것과 관련 될 수있는 다른 주제들. 디스크상의 데이터베이스 일 필요는 없습니다. 메모리의 데이터베이스조차도 (쉽다면) 괜찮습니다. 왜냐하면 그 뒤에있는 주체를 배우고 싶기 때문입니다.

도와 주셔서 감사합니다.

답변:


55

코드를 읽는 데 능숙하다면 SQLite를 공부하면 데이터베이스 디자인에 대한 전체적인 내용을 배울 수 있습니다. 작기 때문에 머리를 감쌀 수 있습니다. 그러나 그것은 또한 전문적으로 작성되었습니다.

http://sqlite.org/


2
sqlite 다운로드의 LOC shell.c => 3135, sqlite3.c => 136332, sqlite3ext.h => 447, sqlite3.h => 7097, 총계 => 147011
Khaja Minhajuddin

1
중괄호 언어를 사용하여 완전한 기능을 갖춘 데이터베이스 엔진을 만들 수있을 정도로 작을 것입니다. SQLite는 C #에서도 사용할 수 있습니다.
Robert Harvey


4
나는 SQLite 2.5.0의 코드를 읽는 것이 좋습니다 : github.com/davideuler/SQLite-2.5.0-for-code-reading , 그것은 현대 GCC에서 컴파일되고 실행될 수있는 초기 버전의 SQLite입니다 (테스트했습니다 MacOS 10.13 및 데비안 8)
David Euler

1
cstack.github.io/db_tutorial 이 좋은 출발점입니다.
Ashish Negi

25

이 질문에 대한 답은 엄청납니다. PHD 논문이 100 %로 응답 할 것으로 예상하지만 문제는 하나씩 생각할 수 있습니다.

  • 데이터를 내부적으로 저장하는 방법 : 데이터베이스 객체와 데이터를 집중적으로로드 할 수있는 캐싱 메커니즘이 포함 된 데이터 파일이 있어야하고 데이터를 RAM에로드하는 경우 데이터가있는 테이블이 있다고 가정하면 데이터 형식이 생성됩니다 열 분리 문자 및 행 분리 문자의 정의에 동의하여이 테이블을 2 진 파일로 변환하고 데이터 자체에서 이러한 분리 문자 패턴이 사용되지 않도록하십시오. 예를 들어 열을 구분하기 위해 <*>를 선택한 경우이 패턴에 포함되지 않도록이 테이블에 배치하는 데이터의 유효성을 검사해야합니다. 행 크기와 내부 색인 번호를 지정하여 행 속도와 열 머리글을 사용하여 검색 속도를 높이고 각 열의 시작 부분에서 "Adam", 1, 11.1, "

  • 위의 동일한 예를 사용하여 서로 다른 기준에 따라 저장되고 캐시 된 데이터를 가리 키도록 해싱 및 인덱싱을 사용하여 항목을 빠르게 찾는 방법은 첫 번째 열의 값을 정렬하여 알파벳 순서로 정렬 된 항목의 행 id를 가리키는 별도의 개체에 저장할 수 있습니다 , 등등

  • Oracle에서 데이터 삽입 속도를 높이는 방법은 RAM과 디스크 모두에서 임시 위치에 데이터를 삽입하고 주기적으로 하우스 키핑을 수행하는 것입니다. 데이터베이스 엔진은 항상 구조를 최적화하지만 바쁘지 않습니다. 그런 정전의 경우 데이터를 잃고 싶습니다. 따라서 정렬하지 않고이 임시 장소에 데이터를 보관하고 원래 스토리지를 추가 한 다음 나중에 시스템이 자유 리조트 인 경우 인덱스를 작성하고 완료되면 임시 영역을 지우십시오.

행운을 빈다.


11

SQLite는 이전에 언급되었지만 몇 가지를 추가하고 싶습니다.

저는 SQlite를 공부하면서 개인적으로 많은 것을 배웠습니다. 흥미로운 점은 소스 코드를 보지 않았다는 것입니다 (단순히 보았지만). 나는 기술 자료를 읽고 특히 내부 명령을 보면서 많은 것을 배웠다. 내부에 자체 스택 기반 인터프리터가 있으며 Explain을 사용하여 내부적으로 생성 된 P- 코드를 읽을 수 있습니다. 따라서 다양한 구조가 어떻게 저수준 엔진으로 변환되는지 볼 수 있습니다 (놀랍게도 간단하지만 안정성과 효율성의 비결이기도합니다).



9

좋아, SQL 및 구현에 대한 정보가있는 사이트를 찾았습니다. 모든 자습서를 나열하는 페이지로 연결하기가 약간 어렵 기 때문에 하나씩 연결합니다.


8

www.sqlite.org에 중점을 둘 것을 제안합니다.

최근의 작은 (소스 코드 1MB), 오픈 소스입니다 (그래서 스스로 알아낼 수 있습니다) ...

그것이 어떻게 구현되는지에 관한 책들이 쓰여졌습니다 :

http://www.sqlite.org/books.html

데스크톱 컴퓨터와 휴대 전화 모두에 대해 다양한 운영 체제에서 실행되므로 실험이 쉽고 학습이 현재와 미래에 유용 할 것입니다.

/programming/tagged/sqlite : 여기에도 괜찮은 커뮤니티가 있습니다.


1
3.10의 바이트 크기는 이제 거의 7.0MB의 소스 코드입니다. 특권을 가진 소수의 사람들 만이 한 번에 모든 것을 소화 할 수있었습니다. 그럼에도 불구하고, 이것은 또한 시작하기에 좋은 장소입니다.
Laurie Stearn

1
과연. 최근 SQLCipher에서 버그를 찾기 위해 SQLite의 소스 코드 내에서 시간을 보냈지 만 절대 악몽입니다. 인생은 6 년 전에 더 단순했다 :-)
michael aubert

파티를 놓친 빠른 질문입니다. 첫 번째 버전부터 시작하는 것이 훨씬 더 편안하고 유용 할 것 같습니다. 실제로 큰 프로젝트의 모든 심각한 코드 읽기를 위해 그렇게해야합니까?
Nicholas Humphrey

7

HSQLDB 에서 배울 수 있습니다 . 나는 그들이 학습을위한 작고 간단한 데이터베이스를 제공한다고 생각합니다. 코드는 오픈 소스이므로 코드를 볼 수 있습니다.


3

그것이 귀하의 요구 사항에 맞는지 확실하지 않지만 SELECT, INSERT , UPDATEperl을 사용하여 간단한 ( ) 을 지원하는 간단한 파일 지향 데이터베이스를 구현했습니다 .
내가 한 것은 각 테이블을 파일과 디스크에 파일로 잘 정의 된 패턴으로 저장하고 awk 및 sed와 같은 내장 Linux 도구를 사용하여 데이터를 조작하는 것입니다. 효율성을 높이기 위해 자주 액세스하는 데이터를 캐시했습니다.


1
여전히 코드를 가지고 있습니까? 링크를 공유 할 수 있습니까
GK1

3

MySQL이 관심이 있다면이 위키 페이지를 제안한다.이 페이지 에는 MySQL의 작동 방식에 대한 정보가있다. 또한, 당신은보고 싶어 할 수 있습니다 MySQL 내부 이해를.

데이터베이스 엔진에 대한 비 SQL 인터페이스를 고려할 수도 있습니다. Apache CouchDB를 살펴보십시오 . 이것이 바로 문서 지향 데이터베이스 시스템입니다.

행운을 빕니다!


또 다른 db를보고 싶다면 : sqlserverinternals.com SQl 서버 내부의 nbooks가 최고입니다.
HLGEM
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.