나만의 데이터베이스 시스템 만들기


65

데이터베이스를보다 효율적으로 사용하기 위해 데이터베이스가 작동하는 방식을 배워야하며 학습 방식이 필요합니다.

내 데이터베이스 시스템을 만들고 싶습니다. 쿼리를 사용하여 파일을 구문 분석하는 의사 데이터베이스를 만드는 것은 아닙니다. 이것은 단순히 쿼리 언어가있는 파일 시스템 인터페이스 일 것입니다. 데이터베이스 엔진의 실제 구조에 대해 이야기하고 있습니다. 그리고 내가 생각하는 것은 관계형이거나 문서 지향적이지 않기 때문에 (가능한 경우 "노드 지향"입니다) 가능한 한 추상적이고 높은 수준의 리소스가 필요합니다.

그럼 어떻게 만들까요? 이해할 수있는 자료 / 자습서 / 책은 무엇입니까?

언어는 가장 중요하지 않습니다. 이상적으로, 코드는 특정 언어에 묶여 있지 않고 개념을 설명하기 위해 의사 코드 일 것입니다. Google에서 문제에서 아무것도 찾을 수 없었습니다 (제가 주제에 대해 글을 읽지 못했기 때문에 올바른 검색에 들어 가지 않을 수도 있습니다).

이러한 리소스를 사용할 수 없으면 클라이언트를 만드는 방법에 대한 것이 적어도 올바른 방향으로 나아가는 것 같습니다.


15
대신 컴파일러를 작성하지 않겠습니까? 아니면 더 나은 운영 체제입니까? 자신의 데이터베이스를 작성하는 데 정말로 진지한 경우 수천 개의 오픈 소스 데이터베이스가 있습니다. 소스 코드를 연구하고 몇 가지 패치를 제공하십시오. 그런 다음 자신만의 건물을 생각하십시오.
yannis

4
대학 수준 및 대학원 수준의 데이터베이스 과정을 수강 할 수 있습니다. 온라인에는 많은 오픈 소스 코스가 있습니다. 교과서를 몇 권 구입하여 여가 시간에 공부할 수도 있습니다. 이를 통해 몇 가지 아이디어와 출발점이 제공됩니다. PostgreSQL에 대한 이력과 뉴스를 읽는 것도 도움이 될 것입니다 (상상력은 그러한 기능이 실제로 어떻게 구현되는지 전혀 알 수는 없지만)
rwong

9
I studied open-source DBs, but their codebase is too huge: redis 또는 flockdb 와 같은 것이 너무 커서 읽을 수 없다면 글을 쓰거나 데이터베이스를 소유하는 방법을 알 수 없습니다.
yannis

10
@YannisRizos 공정성에서 코드 읽기 (imo)는 직접 작성하는 것보다 훨씬 어렵습니다.
AlexWebr

12
@Xananax : 개구리 (듣지 않아 crystal-reflections.com/stories/story_73.htm ). 당신이 즐기는 것은 무엇이든하고 그 과정에서 기쁨을 누릴 목표를 가질 필요는 없습니다.

답변:


61

(존재하는 경우 "노드 지향")

여기서 시작하십시오. 데이터베이스와 같은 복잡한 응용 프로그램을 처리 할 때 (단순한 데이터베이스는 복잡한 응용 프로그램 임에도 불구하고) 도메인 히스토리와 적절한 용어에 익숙해야하며 아키텍처에 대한 최소한의 개념을 가지고 있어야합니다. Database 의 Wikipedia 기사에서 시작할 수 있습니다. 며칠 동안 관련 개념과 다른 데이터베이스 유형에 대한 모든 기사를 읽었습니다.

그리고 내가 생각하는 것은 관계형이거나 문서 지향적이지 않기 때문에

다음으로 Relational 또는 NoSQl을 선택합니다. NoSQL을 선택하면 한 가지 유형의 NoSQL을 선택해야합니다. 그것은 매우 중요합니다. 모든 다른 데이터베이스 제품군에 대해 논의하는 건축 문서는 찾을 수 없습니다. 어느 것을 선택하든 상관 없습니다. 하나만 골라서 붙이십시오.

언어는 가장 중요하지 않습니다.

데이터베이스 제품군을 선택한 후에는 해당 제품군의 오픈 소스 데이터베이스에서 코드를 탐색해야하기 때문에 (불행히도) 그렇습니다. 찾아야 할 사항에 대한 몇 가지 일반적인 지침이 있습니다.

  • 비교적 작은 코드베이스
  • 건축 문서 또는 최소한 개발 블로그
  • 선택한 데이터베이스는 제품군에서 일반적으로 고려되는 것과 비슷해야하며 고도로 전문화되어 있으면 배우기가 더 어렵습니다.

적합한 몇 가지 예 :

소스를 가져 와서 컴파일하고 사용하십시오. 패치 나 멋진 것을 제출할 필요는 없습니다. 코드를 탐색하고 여기저기서 약간만 변경하면 어떤 일이 발생하는지 확인할 수 있습니다. 점진적인 프로세스이므로 코드를 더 많이 사용하면 코드의 기능을 더 쉽게 이해할 수 있습니다. 첫 번째로 선택한 프로젝트를 이해하기가 매우 어려워 보인다면 다음 프로젝트로 넘어가십시오.

@NB가 이전 답변 에서 제안한 것처럼 또 다른 좋은 옵션은 MySQL 엔진을 구축하는 데 집중하는 입니다.

코드베이스에서 유용한 작업을 수행 할 수있는 시점에 도달하면 프로젝트 커뮤니티에 참여하십시오. 이것이 관련 개념에 대한보다 자세한 자료를 찾는 가장 쉬운 방법입니다.

그런 다음 마지막으로 데이터베이스 작업을 시작하십시오. 처음에는 탐색했던 코드의 축소 된 복제본을 작성할 수 있습니다. 독창적 일 필요는 없으며 아주 훌륭한 프로젝트가 클론이나 포크로 시작되었습니다.

이해할 수있는 자료 / 자습서 / 책은 무엇입니까?

꽤 많은 책들이 있습니다 :

또한 수백 개의 다른 문서와 Google을 통해 쉽게 추적 할 수있는 수많은 학술 논문이 있습니다. 먼저 할 일을 정의한 다음 책을 검색해야합니다. 동료 데이터베이스 작성자 커뮤니티에 참여하면 책 목록을 좁히고 위의 것보다 훨씬 더 나은 제안을 얻을 수 있습니다.

행운을 빕니다! 완료되면 리포지토리에 대한 링크가있는 주석이 필요합니다. 그리고 당신이 한 번도하지 않았다면, 2001 년에 작성하기 시작한 컴파일러를 아직 끝내지 않았다는 것을 알려주는 의견을 남기십시오.


5
이것은 좋은 포스트입니다
Chani

2
이 슈퍼입니다! 더 많은 당신에게서 오는 :) 나는 거의 서로 대답을 받아들이고 싶지만 하나를 선택해야하기 때문에 이것이 있어야합니다. I'm expecting a comment with a link to your repository when you're done: 가장 확실하게! 다시 한 번 감사드립니다. 여러분과 다른 모든 사람들에게 이것은 정말 고상했습니다.
Xananax

3
그리고 같은 대답을 찾는 사람이라면 : flockDB는 배우기 가장 좋은 후보라고 생각합니다.
Xananax

@Yannis, Btw 당신이 추천 한 책 중 어느 것이 당신이 읽은 책입니까?
Pacerier

@ Xananax Sooo 어떻게 되나요? 우리가 볼 수있는 모든 저장소? :)
Radu Murzea

27

그냥하고 너무 많이 생각하지 말아야합니다. 학습 과정과 열정을 즐기는 것은 선물입니다.

좋은 아이디어인지 다른 사람들에게 묻는 것은 확실히 좋은 전략이 아닙니다 . 내가 모든 개구리의 말을 들었다면 오늘도 이케아에서 쇼핑 카트를 주차장에서 창고로 밀고갔습니다.

Ayende가 그 흥미로운 게시물 에서 한 것처럼 자신을 정당화 할 필요는 없습니다 . 문제는 :

그러나 실용적인 개발자로서 CouchDB, MongoDB, Tokyo, Redis 등과 같은 매우 성숙한 대안이있는 포화 시장 에서이 프로젝트가 무엇을 제공하는지 궁금합니다. 이러한 제품 중 상당수는 플랫폼 간이며 C 속도로 입증 된 기록을 가지고 있으며 샤딩 기능과 내결함성이 멀리 떨어진 매우 큰 웹 사이트에서 사용됩니다.

당신이 과정에서 기쁨을 가져 가면 목표에 대해 걱정하지 마십시오. 이미 이겼습니다.


4
+1, 매우 사려 깊고 교육 답변 :-) ... somehting을하고 싶은 사람에게 정말 좋은 답변
Pankaj Upadhyay

정말 좋습니다. 나는 이것을 받아 들일 직전이었다. 나는 yannis의 대답이 요점에 가깝고 사람들이 같은 질문을하는 데 도움이 될 것이라고 생각했기 때문이 아닙니다. 그러나 이것은 확실히 고무적이었습니다. 고마워
Xananax

Yannis의 답변이 나의 것보다

6

"(존재하는 경우"노드 지향 ")". -이것이 당신이 많이 찾지 못하는 이유 일 수 있습니다!

버전 0.1로 뛰어 들어 어디서 얻을 수 있는지 확인하십시오. "해야 할 일"을 묻는 것으로부터 원하는 것을 만들어내는 것에서 더 많은 것을 배울 수 있습니다. 며칠을 내고 어디를 가졌는지 검토하십시오.

약 18 년 전에 저는 btree 인덱스를 사용하여 기본 데이터베이스 시스템 (재미를 위해 그림을 작성)을 작성하고 끔찍한 것을 배웠습니다.



4

훌륭한 프로젝트처럼 들립니다. 분명히 당신의 목표는 프로덕션 소프트웨어를 만드는 것이 아니라 데이터베이스와 데이터베이스 시스템을 만드는 과정에 대해 배우는 것입니다.

정말 많은 연구가 필요하다고 생각하지 않습니다. 노드 기반 데이터베이스 시스템을 만드는 데 경험을 얻는 것이 목적인 것 같습니다.

시작하는 방법은 다음과 같습니다.

  1. 좋아하는 언어 나 개선하려는 언어를 선택하십시오.
  2. 노드 객체 (또는 언어에서 가장 가까운 것)를 만듭니다. 그것들을 연결하는 방법을 알아 내십시오.
  3. 먼저 구현할 짧은 SQL 문 목록을 작성하십시오.
  4. 데이터 저장 방법을 결정하십시오. 한 가지 확실한 해결책은 모든 노드를 직렬화하고 프로그램이 시작될 때로드 한 다음 프로그램이 끝날 때 저장하는 것입니다.

기본 사항을 익힌 후에는 어렵거나 문제가있는 것에 대해 훨씬 더 많은 통찰력을 얻게됩니다. 그런 다음 그것에 대해 조사하고 개선점을 찾은 다음 통합 할 수 있습니다.


1
제안한 단계를 따르고 있습니다. 1,2,3은 문제 없습니다. 그러나, 나는 # 4에 의해 넘어졌다. 많은 양의 데이터의 경우 관련 부품 만 메모리에 어떻게로드합니까? 모든 것을 이진 데이터로 저장하고 다른 색인 파일을 유지하려고 생각했지만 사용자가 색인으로 쿼리하지 않으면 어떻게됩니까? 나는 여전히 전체 파일을 반복해야 할 것입니다 ... 다른 질문을 할 때가 된 것 같습니다
Xananax

왜 모든 것을 메모리에 저장하지 않습니까? 1GB를 사용하면 많은 양의 데이터가 저장됩니다. 또는 각 이진 데이터 노드를 디스크에 저장하면 텍스트에 1GB가 필요합니다. 그것은 많은 텍스트입니다. 어쨌든 1GB보다 큰 데이터베이스를 처리하는 것이 운동의 중심이 아니라고 생각합니다.
B 세븐

또한 1GB의 메모리 내에서 효율적으로 작동하는 많은 방법을 만들 수 있습니다. 나중에 시스템의 해당 부분을 개선 할 수 있습니다. 한 가지 해결책은 모든 노드 정보를 메모리에로드하지만 각 노드의 데이터를 디스크에 저장하는 것입니다. 이렇게하면 노드를 효율적으로 탐색 할 수 있으며 디스크에만 액세스하여 실제로 필요한 데이터를 검색 할 수 있습니다.
B 세븐

3

데이터베이스가 "어떻게 작동하는지 이해하기 위해"자신 만의 데이터베이스를 작성하는 것이 그렇게하는 유일한 이유입니다 (데이터베이스가 제대로 이해하기 어렵고 올바른 것으로 증명하기 어렵 기 때문에). 당신은 미쳤지 만 좋은 방법으로!

어떻게 수행되는지 보려면 SQLite를 살펴 보는 것이 좋습니다. SQLite는 소스는 1.3MB 압축 약이며, 그것은 완전히 ACID 호환 트랜잭션 데이터베이스입니다. 또한 공개 도메인 이며 주요 저자는 귀하의 질문에 기꺼이 답변 할 것입니다. (정보를 디스크에 실제로 커밋하는 방법에 가장 까다로운 부분이 있다고 생각합니다. OS와 하드웨어가 거짓말을 멈추고 트랜잭션을 지금 작성하도록 설득하는 것은 놀랍게도 어려운 일이며 DB를 작성할 필요가없는 이유는 무엇입니까?)


1
SQLite 코드베이스는 0,2 * 10 ^ 6 loc (5mb 압축 해제)에 접근하지만 그렇게 작지는 않습니다 .
yannis

1
@Yannis : MySQL, PostgreSQL 또는 다른 서버 DB 시스템과 비교…
Donal Fellows


3

데이터베이스 작동 방식을 배워야합니다

관계형 대수를 배우십시오.

작은 DB 엔진을 찾고 소스를 배우십시오.

보다 효율적으로 사용하기 위해

아니. 데이터베이스를 효율적으로 사용하는 방법을 배워야합니다. 자동차의 작동 방식을 이해하면 더 나은 운전자가 될 수 있지만 운전에 집중하면 훨씬 더 나은 운전자가 될 수 있습니다.

과정을 밟고, 책을 읽고, 동료 리뷰를하고, 질문하고, 색인을 사용하십시오 .


5
Learn relational algebra.op가 관계형 데이터베이스에 관심이 있다고 가정하면 ...
yannis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.