iOSDC Japan 2026 - Swiftで作って学ぼう!データベース自作入門
by
kaseken (Kent Kaseda)
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
Swift で作って学ぼう!データベース自作入門 iOSDC Japan 2026 @kentkaseda kaseken kaseken 1
Slide 2
Slide 2 text
スライド1)・原稿2)は公開済み 1) https://speakerdeck.com/kaseken/iosdc2026 2) https://github.com/kaseken/db.swift/blob/main/docs/iosdc2026.md 2
Slide 3
Slide 3 text
データベースを “使った” ことがある人 3
Slide 4
Slide 4 text
データベースを “作った” ことがある人 4
Slide 5
Slide 5 text
本日の目標 この場にいる全員に データベースの自作をトライさせること 5
Slide 6
Slide 6 text
なぜデータベースの自作をオススメするのか? 6
Slide 7
Slide 7 text
なぜデータベースの自作をオススメするのか? ① 技術領域によらない 7
Slide 8
Slide 8 text
なぜデータベースの自作をオススメするのか? ② 時代によらない 8
Slide 9
Slide 9 text
以下のプロンプトを実行! > https://cstack.github.io/db_tutorial の内容をSwiftで実装してください ただし、クエリの形式はSQLに準拠してください Thanks to @cstack for this great tutorial! 9
Slide 10
Slide 10 text
AIを使うのはずるくない?🤔 10
Slide 11
Slide 11 text
これなら全員できますよね?🤗 11
Slide 12
Slide 12 text
私の場合... チャプターごとにAIで実装 生成されたコードをレビュー 次のチャプターへ 腑に落ちるまで AIに質問 & リファクタリング Ref) https://github.com/kaseken/db.swift 12
Slide 13
Slide 13 text
13
Slide 14
Slide 14 text
14
Slide 15
Slide 15 text
15
Slide 16
Slide 16 text
16
Slide 17
Slide 17 text
17
Slide 18
Slide 18 text
こちらのやり方を紹介しました データベースを自作する! データベースの仕組みを理解する! 18
Slide 19
Slide 19 text
データベースを自作する! データベースの仕組みを理解する! これから説明 19
Slide 20
Slide 20 text
アーキテクチャ SQL SQLパーサー 命令 B+Tree データの取得・更新 ページャー データの取得・永続化 ファイル 20
Slide 21
Slide 21 text
アーキテクチャ SQL SQLパーサー 命令 B+Tree データの取得・更新 ページャー データの取得・永続化 👉 ファイル 21
Slide 22
Slide 22 text
ファイル ページ 0 ページ 1 ページ 2 ページ 3 4096バイト 22
Slide 23
Slide 23 text
ファイル ページ 0 ページ 1 ページ 2 ページ 3 レコード 0 レコード 1 レコード 2 レコード 3 23
Slide 24
Slide 24 text
ファイル ページ 0 ページ 1 ページ 2 ページ 3 レコード 0 レコード 1 レコード 2 レコード 3 カラム1 (id) カラム2 (name) カラム3 (email) 24
Slide 25
Slide 25 text
SwiftDataでもファイルに保存される 25
Slide 26
Slide 26 text
👇 データベースのファイル 26
Slide 27
Slide 27 text
行指向DB (e.g. MySQL) カラム ① カラム ② カラム ① カラム ② 列指向DB (e.g. BigQuery) カラム ① カラム ① カラム ① カラム ① ︙ カラム ① カラム ② カラム ① カラム ② ︙ カラム ② カラム ② カラム ② カラム ② ︙ 27
Slide 28
Slide 28 text
アーキテクチャ SQL SQLパーサー 命令 B+Tree データの取得・更新 👉 ページャー データの取得・永続化 ✅ ファイル 28
Slide 29
Slide 29 text
B+Tree ページ ページャー メモリ ディスク ページ ファイル 29
Slide 30
Slide 30 text
B+Tree ページ ページャー メモリ ページ ディスク ファイル 30
Slide 31
Slide 31 text
キャッシュ ページ 0 ページ 1 nil nil 31
Slide 32
Slide 32 text
B+Tree ページ2ください ページャー キャッシュ ページ 0 ページ 1 nil nil ページ2ください ファイル ページ 0 ページ 1 ページ 2 ページ 3 32
Slide 33
Slide 33 text
B+Tree ページ 2 ページャー キャッシュ ページ 0 ページ 1 ページ 2 nil ページ 2 ファイル ページ 0 ページ 1 ページ 2 ページ 3 33
Slide 34
Slide 34 text
B+Tree ページ 2 ページャー キャッシュ ページ 0 ページ 1 ページ 2 nil ページ 0 ページ 1 ページ 2 ページ 3 ファイル 34
Slide 35
Slide 35 text
B+Tree ページャー キャッシュ ページ 0 ページ 1 ページ 2 nil flush ファイル ページ 0 ページ 1 ページ 2 ページ 3 35
Slide 36
Slide 36 text
アーキテクチャ SQL SQLパーサー 命令 👉 B+Tree データの取得・更新 ✅ ページャー データの取得・永続化 ✅ ファイル 36
Slide 37
Slide 37 text
B+Treeは、内部ノード・リーフノードの 2種類のノードを持つ 内部ノード 内部ノード リーフノード リーフノード 内部ノード リーフノード リーフノード リーフノード 37
Slide 38
Slide 38 text
各ノードは、一ページ分のデータを持つ リーフノード 内部ノード ? ? 38
Slide 39
Slide 39 text
B+Tree ページ ページャー メモリ ディスク ページ ファイル 39
Slide 40
Slide 40 text
B+Treeのノード ページ ページ ページャー メモリ ディスク ページ ファイル 40
Slide 41
Slide 41 text
各ノードは、一ページ分のデータを持つ リーフノード 内部ノード ? ? 41
Slide 42
Slide 42 text
リーフノードは、レコード一覧を保持 ページ キー レコード キー レコード キー レコード 42
Slide 43
Slide 43 text
キーによってソートされている ページ 2 レコード 5 レコード 8 レコード 43
Slide 44
Slide 44 text
内部ノードは、子ノードへのポインタとキーの最大値を保持 ページ #1 子ノード #1 #1の最大キー #2 子ノード #2 #2の最大キー #3 子ノード #3 44
Slide 45
Slide 45 text
子ノードに含まれるキーの最大値が、親の内部ノードに保持される #1 10 #1の最大キー レコード 13 #2 レコード 17 #3 17 レコード 45
Slide 46
Slide 46 text
子ノードに含まれるキーの最大値が、親の内部ノードに保持される #1 #1の最大キー #2 35 #3 #3に含まれる キーの最大値 #1 8 #2 17 #3 46
Slide 47
Slide 47 text
キーの最大値はソートされている #1 子ノード #1 8 #2 子ノード #2 17 #3 子ノード #3 47
Slide 48
Slide 48 text
19 21 22 #1 17 #2 35 #3 #1 22 #2 29 #3 24 26 29 30 31 35 48
Slide 49
Slide 49 text
子ノードに含まれるキーの最大値が、親の内部ノードに保持される 19 21 22 #1 17 #2 35 #3 #1 22 #2 29 #3 24 26 29 30 31 35 49
Slide 50
Slide 50 text
#1 8 #2 17 #3 子ノード #1 子ノード #2 子ノード #3 8以下 9以上・17以下 18以上 50
Slide 51
Slide 51 text
キーが12のレコードを検索する場合 ... #1 子ノード #1 8 #2 子ノード #2 17 #3 子ノード #3 9以上・17以下 51
Slide 52
Slide 52 text
内部ノードは、 1ページ内で大量の子ノードを管理 ページ #1 12 #2 31 #3 47 #4 67 #5 78 #6 91 #7 103 #8 123 #9 140 #10 159 #11 171 #12 192 #13 213 #14 244 #15 265 #16 287 #17 302 #18 330 52
Slide 53
Slide 53 text
アーキテクチャ 👉 SQL SQLパーサー 命令 ✅ B+Tree データの取得・更新 ✅ ページャー データの取得・永続化 ✅ ファイル 53
Slide 54
Slide 54 text
SELECT * FROM users WHERE id = 24 SQLパーサー id = 24のレコードを検索 B+Tree 54
Slide 55
Slide 55 text
id = 24のレコードを検索 B+Tree #1 17 #2 35 #3 ルートノードのページを取得 ページャー (未キャッシュの場合) ページを取得 ファイル 55
Slide 56
Slide 56 text
id = 24のレコードを検索 B+Tree #1 17 #2 35 #3 #2に含まれる (18以上・35以下) 56
Slide 57
Slide 57 text
id = 24のレコードを検索 B+Tree #1 17 #2 35 #3 #1 22 #2 29 #3 ノードのページを取得 ページャー (未キャッシュの場合) ページを取得 ファイル 57
Slide 58
Slide 58 text
id = 24のレコードを検索 B+Tree #1 17 #2 35 #3 #1 22 #2 29 #3 #2に含まれる (23以上・29以下) 58
Slide 59
Slide 59 text
id = 24のレコードを検索 B+Tree 24 #1 17 #2 35 #3 #1 22 #2 29 #3 レコード 26 レコード 29 レコード ノードのページを取得 ページャー 59
Slide 60
Slide 60 text
id = 24のレコードを検索 B+Tree 検索結果 24 #1 17 #2 35 #3 #1 22 #2 29 #3 レコード 26 レコード 29 レコード 60
Slide 61
Slide 61 text
INSERT INTO users (id,username,email) VALUES (27,'foo','
[email protected]
') SQLパーサー id = 27のレコードを追加 B+Tree 61
Slide 62
Slide 62 text
id = 27のレコードを追加 B+Tree 24 #1 17 #2 35 #3 #1 22 #2 29 #3 レコード 26 レコード 29 レコード ここに追加すべき 62
Slide 63
Slide 63 text
id = 27のレコードを追加 B+Tree 24 レコード #1 17 #2 35 #3 #1 22 #2 29 #3 26 レコード 27 レコード 29 レコード 追加された 63
Slide 64
Slide 64 text
アーキテクチャ ✅ SQL SQLパーサー 命令 ✅ B+Tree データの取得・更新 ✅ ページャー データの取得・永続化 ✅ ファイル 64
Slide 65
Slide 65 text
データベースを自作する! データベースの仕組みを理解する! 65
Slide 66
Slide 66 text
データベースを自作する! データベースの仕組みを理解する! もっと学びたい方にはCMUの講義1)がおすすめ 1) カーネギーメロン大学の有名講義『 Intro to Database Systems』を全てのプログラマに見てほしい 66
Slide 67
Slide 67 text
皆さんへの宿題です! データベースを自作する! データベースの仕組みを理解する! 67
Slide 68
Slide 68 text
ぜひDBの自作に挑戦してみてください! > https://cstack.github.io/db_tutorial の内容をSwiftで実装してください ただし、クエリの形式はSQLに準拠してください Thanks to @cstack for this great tutorial! 68