メインコンテンツへスキップ

データベースを自分で構築する!難易度自在で深い学びと楽しさを手に入れよう

·2 分
2025/10 データベース システム設計 プログラミング データ管理 分散処理

データベースを自分で構築する!難易度自在で深い学びと楽しさを手に入れよう

引用元:https://news.ycombinator.com/item?id=45657827

nansdotio 2025/10/21 16:31:51

この記事の元ネタは『Designing Data-Intensive Applications』って本だよ。O’Reillyのこのページで確認できるよ。
https://www.oreilly.com/library/view/designing-data-intensiv

kragen 2025/10/22 11:57:27

この記事は魅力的に書かれてるけど、データベースの定義に異論があるな。「永続的なデータ保存と効率的な検索」は、ファイルフォーマットかアクセスメソッドって呼ばれることが多いよ。俺が思うに、データベースのホントのキモは「クエリ評価」だね。PrologやSQLみたいな言語で質問を表現して、インデックスやマテリアライズドビューなんかで効率的に答えることだよ。dbmやISAMはデータベースじゃないけど、SQLiteのインメモリはデータベースだ。

mb2100 2025/10/23 11:05:43

「永続的にデータを保存して、効率的に検索する」っていう定義の「効率的に」って言葉、見落としてるんじゃない?

kragen 2025/10/23 19:10:50

いや、見落としてないよ。多分、お前がISAMとかdbmが何かわかってないから、そう思うんだろうな。

tombert 2025/10/22 01:47:43

数ヶ月前にErlangで自分なりのDBを組んだよ。Bitcaskとriak_coreは使ったけど、レプリケーションや耐障害性は自分でやった。めっちゃ楽しかったな。KVデータベースは、JSONのシリアライズ/デシリアライズから始めて、最終的にちゃんとしたレプリケートされたDBを作って、簡単なクエリ言語まで作ったんだ。難易度を自在に変えられるのがいいよ。

marci 2025/10/22 07:20:05

リポジトリとかある?プロダクションレディじゃなくてもいいよ。mnesiaやCouchDBと比べて、どうやってレプリケーションを処理したのか興味あるんだ。特にErlangがJSONをネイティブサポートした今、どうしてるか知りたいな。

tombert 2025/10/22 13:51:52

ごめん、プライベートリポジトリなんだ。製品として売る野望があって、まだ諦めてないからね。でも、ほとんどの概念はオープンソースのriak_coreから来てるよ。ここだよ。
https://github.com/OpenRiak/riak_core

skeptrune 2025/10/21 19:10:29

この記事のデザインと例がすごくいいね。めちゃくちゃ読みやすいよ。こういう演習はホント楽しいし、ゼロから何かを始めるのは自分の知識がどれだけあるか試される、いい機会になるんだ。

ashleyn 2025/10/21 19:53:31

最初は「自分でDB作るな、KVデータベースも使うな、SQL使え」って即座に却下したくなったんだ。でも、よく考えたら、俺がそう言うのは、SQLを避けるために自分でDB作ったりKVデータベース使ったりして、結局SQLをひどく再発明してた経験があるからだなって。この経験は学ぶ価値があるかもしれないね。

kevinqi 2025/10/21 19:44:57

ちょっとした批判だけど、Lorem ipsumの例を使ってるのが唯一気になるな。あれを見ると読み飛ばしたくなるから、現実的なデータの方が好きだよ。それ以外は、ホントにクールな記事だね。

kragen 2025/10/22 12:01:11

このリンクにあるexampledb.pyってやつ、面白いかもよ。SQL文を生成してくれて、顧客や商品のデータを挿入してくれるんだ。テーブルも作ってくれるよ。会計の例だからちょっとつまんないけど、ランダムなデータが良い味出してるね。今はLLMがあるから、もっと面白いデータ作れるかもな。
http://canonical.org/~kragen/sw/dev3/exampledb.py

WD-42 2025/10/21 20:32:26

俺も同じこと言おうと思ってたんだ。Lorem Ipsumだとデータが区別しにくいよね。動的な例だとテキスト生成が必要なのはわかるけど、ラテン語はベストな選択じゃないと思うな。記事は良かったよ、ありがとう!

doublerabbit 2025/10/21 23:27:57

fooとかbarを例に使われると、俺も同じように感じるよ。

samwho 2025/10/22 07:23:52

誰かに、動物を例に使うのがいいってアドバイスもらったよ。できればサイズとか色が全然違う動物がいいって。そうするとみんなすぐにイメージできて、記憶に残るんだって。

shellfishgene 2025/10/22 08:38:32

記事はすごくいいんだけど、ハッシュテーブルがなんで高速で定数時間検索なのか、もっと詳しく説明してほしいな。インデックスがDBを速くする理由の核心だからさ。

myth_drannon 2025/10/21 20:02:52

データベースを作るなら、この無料のオンラインブックもおすすめだよ!
https://build-your-own.org/database/

bionsystem 2025/10/21 21:12:09

たしか1年くらい前だったかな、ここで誰かがbashの例でデータベースの概念を説明してる記事を見たんだけど(“bashでDBを書く”みたいなやつ)、どこにも見当たらないんだよね。誰か知ってる人いる?

pandaec 2025/10/22 14:49:22

これかな?
https://tontinton.com/posts/database-fundementals/

liqilin1567 2025/10/22 13:20:42

元記事の投稿者がブログで使ってるフレームワークはこれだよ。
https://github.com/nandanmen/NotANumber

jumploops 2025/10/21 21:42:41

LSM treesはDynamoDBの基盤データ構造だけど、8000万rpsを捌けるってのはちょっと誤解を招くかな。LSMはノードレベルのストレージエンジンで使われてるだけで、分散システム全体でどうスケールするかは説明してないもんね。昔のDynamoはBerkeleyDB(B-treeかLSM)だったけど、2012年の論文からは完全にLSMベースになったって聞いたよ。

keybored 2025/10/21 20:05:49

「こうしなきゃ」って考えると、やることが多すぎて頭がパンクしちゃうから、「maker」になれないんだよね。この記事も最初は面白いんだけど、どんどんストレスに感じてくる。汎用データベースを作りたいわけじゃないけど、もっと小さなタスクでも考えすぎちゃうんだ。

ozgrakkurt 2025/10/22 08:04:49

俺も全く同じ問題を抱えてたけど、最近は「信じること」が大事だって気づいて、かなり良くなったんだ。成功すると信じれば、問題は一時的な障害になる。でも失敗するって信じちゃうと、どんな問題も絶望的なものに見えちゃうからね。

browningstreet 2025/10/21 20:13:34

君の意見は分かるんだけど、細かい情報を読むのと、それに深く関わるのは違うって思うんだ。もし本当にその要件を満たそうとしてるなら、すごく夢中になれるだろうけど、そうでなければ読み飛ばしちゃうよね。今週引っ越しなんだけど、考えるのはすっごく大変なのに、実際にやるのはそれほどでもないんだよ。

nawgz 2025/10/21 21:11:20

ADHDの可能性を考えたことある?

TheAnkurTyagi 2025/10/22 07:07:43

データベースが内部でどう動くのか、ビジュアルも使ってすごく分かりやすく説明されてるね。筆者は素晴らしい先生だわ。

constantcrying 2025/10/21 20:23:15

この「first principles」アプローチで説明するやり方が本当に大好きだよ。これを読み進めると、その時々で何を解決すべき問題で、それがどんな別の問題を引き起こすのかを理解できて、最終的に納得できる解決策にたどり着けるんだ。

chrisallick 2025/10/21 20:18:06

もし筆者がこれ読んでたら、サイトにRSSフィードを追加してくれない?Feedlyに追加したいんだけど。

jayfair 2025/10/22 05:42:49

Kill The Newsletterってサービスが、メール配信しかしてないサイトをフォローするのにすごく便利だよ。https://kill-the-newsletter.com/

chrisallick 2025/10/23 02:17:06

omg天才じゃん、笑。こんなにシンプルで賢いユーティリティってすごいな。これ、Chrome拡張機能作ってみようかな。

jamwil 2025/10/22 01:21:12

これ、追加するのめっちゃ楽しみだったんだ!全体的にプロダクションの質が高いのに、見つからなくてマジでびっくりしたよ。

もっとコメントを表示(1)
darkstar_16 2025/10/22 07:36:43

大学の卒業制作の一つで、C言語で基本的なデータベースを設計・プログラミングしたんだ。20年経った今でも、それがプロジェクトの中で一番面白かったと思ってるよ。

FpUser 2025/10/21 19:35:08

>問題:データを永続的に保存し、後で効率的に参照するにはどうすればいいか?
ってあるけど、実際問題としてトランザクションがないなら、まだデータベースとは言えないと思うな。

dangoodmanUT 2025/10/21 19:50:30

多くのデータベースはそうは思わないだろうね。

socketcluster 2025/10/22 02:57:52

代わりに2フェーズコミットを実装できるよ。データ管理でちょっと計画が必要だけど、こっちの方がずっとエレガントでスケールすると思うな。DBトランザクションは高価で無駄に複雑だよ。
シンプルな2フェーズコミットなら、最初は全レコードを’保留中’としてマークして、関連行が全て挿入されたら’確定済み’に更新すればOK。タイムスタンプを記録すれば再開場所が分かるしね。以前、IDをハッシュ化して特定のプロセスにマッピングし、複数プロセスが並行して決済するシステムを作ったんだけど、これめっちゃスケールしたよ。

FpUser 2025/10/22 06:06:41

>’代わりに2フェーズコミットを実装できる’ってあるけど、2フェーズコミットはシステムが分散している時のトランザクション実装の特定の方法だよ。’代わりに’って話じゃないよね。

socketcluster 2025/10/23 22:32:52

システムは分散型である必要はないよ。一般的に、レコードの挿入とそれらの決済を分けるだけでいいんだ。

FpUser 2025/10/21 19:59:16

何か良いことを見つけたかもしれないね。

alecco 2025/10/21 20:06:37

でも、それってウェブスケールだよ!

exdeejay_ 2025/10/21 20:34:06

「Sorting in Practice」セクションの最初の例が壊れてるみたいだよ。テキストではインメモリでソートしてからディスクに書き出すって言ってるのに、例だとディスクに書き出す時にリストが未ソートになっちゃうんだ。追記:Recapセクションのflush例(2番目のやつ)も同じことをしてるね。そこではレコードがソート順にファイルに書き込まれるって書いてあるのに。

0xb0565e486 2025/10/21 20:44:54

この4週間くらいずっとtriple store作りに時間を費やしてたんだ!この記事がもっと早く出てたらよかったな。ここに書いてあるいくつかの洞察は、俺が理解するのにかなり時間がかかったからね :)

vladpowerman 2025/10/21 20:52:47

すごく良い記事だね。俺は開発者の活動を、各開発者がキーでコミットがバリューの時系列キーバリューシステムとしてモデリングしてるんだ。
同じ問題に直面したよ:ログがすぐ増える、インデックスが重くなる、範囲クエリが遅くなる。
セグメントを圧縮する時、何を捨てるかどう決めてる?鮮度と保持のバランスって難しいよね。

withinboredom 2025/10/22 07:50:30

データ量はどのくらいあるの?俺は12年分の開発データを持ってるけど、レポートは数秒、いやミリ秒単位で生成されるよ。キーパターンはどうなってる?キー設計の問題に聞こえるけど。

LourensT 2025/10/22 10:08:39

素晴らしい投稿だし、ウェブサイトも美しいね。memtableが満杯になった時に起こるflush操作で少し混乱しちゃったんだ。新しいオンディスクセグメントが作成されるって簡単なメモがあれば助かるかな。最後のrecapでもセグメンテーションが触れられてないみたい。

curtisblaine 2025/10/22 07:38:14

最後の方で少し曖昧になるね。インデックスは別々の(部分的な)エンティティとして描かれてるけど、これらは全部別々のファイルに保存するのかな?もしそうなら、レコードを検索するためにそれら全部を開く必要があるの?

235ylkj 2025/10/21 19:01:43

D.B. Cooperにインスパイアされたシンプルなキーバリューストアがこれだよ。~/bin/cooper-db-set~/bin/cooper-db-getのシェルスクリプトが書いてあるね。キーとバリューを/dev/nullに書き込むってジョークかな。

MathMonkeyMan 2025/10/21 19:49:39

/dev/nullは再起動後も永続的だしキャッシュにも優しいから、バッチリカバーしてくれるよ。

DiabloD3 2025/10/21 20:05:14

もうすでに、アクセス集中しすぎてダウンしちゃったみたいだね。

orliesaurus 2025/10/21 21:05:59

このブログ記事のレイアウト、俺だけがめちゃくちゃ気に入ってるのかな?

saxelsen 2025/10/21 20:48:03

インタラクティブなのは素晴らしいけど、これ『Designing Data-Intensive Applications』から完全にパクってるじゃん。文字通り全部の内容が第3章のインタラクティブ版だよ。引用元を明記すべきじゃない?

nansdotio 2025/10/22 15:19:21

やあ!記事の著者だよ。文章自体は俺自身の言葉なんだけど、論理構造と例は確かにDDIAの第3章を基にしてたんだ。これは俺のミスだね。サイトは適切な引用元表記に更新されたよ。

tomhow 2025/10/22 00:09:22

ありがとう、これをスレッドのトップテキストに追加したよ。

oneeyedpigeon 2025/10/22 09:14:12

おいおい、それじゃ不十分だろ。a) 親コメントは“丸パクリ”って言ってたのに、君は“インスパイアされた”って薄めてるけど、どっちなの? b) HNでこの投稿を編集しただけで、実際の元の記事にはまだ引用元が一切書かれてないよ。

tomhow 2025/10/22 11:54:31

うん、その通りだね。記事の出版社と連絡を取ったよ。コミュニケーションの詳細は開示できないけど、ヘッダーテキストを更新したし(最初のコメントの疑惑を見た時に投稿した内容に)、投稿の評価も下げたよ。

4ndrewl 2025/10/21 18:01:24

“データベースは一つの問題を解決するために作られた:
“データを永続的に保存し、後で効率的に検索するにはどうすればいいか?””ってあるけど、これって二つの問題じゃないの?

i_k_k 2025/10/21 18:40:44

俺、いつもライトオンリーなデータベースを出荷したいと思ってたんだ。超高速でね。

dayjaby 2025/10/21 18:12:02

データを永続的に保存して、効率的に検索できるようにする*ってのは、一つの問題に聞こえるよ。

SirFatty 2025/10/21 18:22:41

記事の文脈が分からないけど、きっと選択肢が二つあるって話だね。

archerx 2025/10/21 18:58:26

それ、ログ記録にはかなり役立ちそうだね。

cjbgkagh 2025/10/21 18:23:40

もし後で復元できないなら、それは永続性があるとは言えないよ。

grokgrok 2025/10/21 18:33:27

過去のメモリ状態をどう再構築するかが根本的な問題だよね。ストレージや検索効率、信頼性、セキュリティとか、色んな要素の優先順位がデータベース設計の鍵になるんだ。

もっとコメントを表示(2)
pratik661 2025/10/21 18:59:56

これって、一方通行のエレベーターみたいなもんだね。

stvltvs 2025/10/21 18:45:58

メッセージを瓶に入れて、一番都合の良いブラックホールにポイっと投げ込む感じだね。

pcdevils 2025/10/21 18:57:45

EventStoreDBって、だいたいこんな感じの仕組みだよね。
データの完全削除は、データファイルを書き直す scavenge の時だけだよ。

BetaDeltaAlpha 2025/10/21 18:57:36

ブラックホールに入れたら、瓶が復元不能なほど圧縮されちゃうんじゃないの?

hxtk 2025/10/21 19:32:25

あれはジョークだと思うよ。君は追記専用のLSM treeデータベースみたいに解釈したようだけど、GPは読み込みなしの書き込み専用、つまり echo $data > /dev/null みたいに言いたかったんじゃないかな。

warkdarrior 2025/10/21 18:59:47

もし書き込み専用で、読み込みが全然発生しないなら、/dev/nullに書き込んでも全然困らないよね。

kiitos 2025/10/21 19:09:06

過去のメモリ状態を再構築するってどうやるの?それが根本的な問題だよね。でも、過去のメモリ状態の再構築って、データベース層で対応しなきゃいけない要件になることって、めったにないし、ほぼないんじゃないかな。

elygre 2025/10/21 18:52:28

80年代にさ、うちの大学の教授が「ライトオンリーメモリ」っていうコンセプトのプレゼンを、シンポジウムで採択されたんだってさ。いい時代だったな、マジで。

prerok 2025/10/21 19:14:01

ただデータを保存したいだけならファイルで十分だよ。でも検索が面倒だし効率悪いよね。永続ストレージが解決済みだとして、データベースの存在意義はデータを効率的に検索することにあるって言える。永続ストレージは前提だけど、それが発明された理由なんだよ。

nonethewiser 2025/10/21 19:37:07

もう少し詳しく説明してくれない?普通のCRUDアプリだと、データを永続化して後でロードできるようにするモデルがあるよね。分析目的でデータを取り込むこともあるだろうけど、それは「過去のメモリ状態を再構築する」ってのにはあまり当てはまらない気がするな。

mrighele 2025/10/21 20:08:56

それは二つの小さい問題を含む一つの問題だけど、本当に難しいのは(三つ目の問題だとして)それらを一つにまとめることだよ。もし君がその二つの問題を別々に解決することに限定したら、役に立つデータベースは作れないだろうね。

SahAssar 2025/10/21 18:37:18

「データを永続的に保存する」ってのは、「検索できる」ってことだよね。だって、検索できなかったら永続的に保存されてるかなんてわからないでしょ。ただ、「効率的に」って部分は、別の問題として考えてもいいと思うよ。

datadrivenangel 2025/10/21 19:59:47

そんなに低いところから数えるの、忘れちゃったよ。ゼロゼロ — https://www.youtube.com/watch?v=3t6L-FlfeaI

nonethewiser 2025/10/21 19:38:33

「特定のやり方でデータを保存する」ってのはどうかな。そっちの方が一つの問題っぽいし、もっと大きな問題空間を含んでる気がするけどね。

Etheryte 2025/10/21 20:11:10

バックアップにも役立つよ、ただし復元する必要がない限りね。

mamcx 2025/10/21 22:23:46

問題は2つに分けられるって言っても、実際は1つだよ。それはね、「未知のクライアントとアクセスパターンが、ACIDに則って、競合をブロックせずに、高速にデータを永続保存して効率的に検索できる方法」っていう問題なんだ。んで、SQLを追加すると…(痛っ!)って感じ。

nonethewiser 2025/10/21 19:42:41

この指摘がHacker Newsで真剣な議論を呼んでるのが面白いね。俺も1つか2つか考えちゃう。「AとB」ってあるから2つに見えるけど、同じコインの裏表にも思える。哲学と屁理屈の境目は微妙だね。
データベースが解決すべき問題がもし2つなら、「データを永続的に保存する」ってのもそうなる。でも、それはデータベース以前から解決済みだよね。「データを効率的に検索できるように保存する」ってのが1つの問題って言う方が公平じゃないかな?

lelanthran 2025/10/22 05:55:49

「データを永続的に保存して、後で効率的に検索する方法?」
「それって2つの問題じゃないの?」
ライトオンリーのデータベースを作るならね。それなら/dev/nullに書き込むだけでいいじゃん。

mewpmewp2 2025/10/21 19:30:47

じゃあ、寝る前に読むのにちょうど良いね。

rzzzt 2025/10/21 19:02:37

人々が入れるようにするデータベースだね。出口は後で考えるとして、別のフロアから出るのはストレッチゴールにしよう。

theideaofcoffee 2025/10/21 20:19:54

それか、ただのパタノスターだね。

記事一覧へ

海外テックの反応まとめ
著者
海外テックの反応まとめ
暇つぶしがてらに読むだけで海外のテックニュースに詳しくなれるまとめサイトです。