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