Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
iOSDC Japan 2026 - Swiftで作って学ぼう!データベース自作入門
Search
kaseken (Kent Kaseda)
September 11, 2026
Programming
450
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
iOSDC Japan 2026 - Swiftで作って学ぼう!データベース自作入門
kaseken (Kent Kaseda)
September 11, 2026
More Decks by kaseken (Kent Kaseda)
See All by kaseken (Kent Kaseda)
Kotlin Fest 2025 - 内部実装から理解する Coroutines ― Continuation・Structured Concurrency・Dispatcher
kaseken
3
2k
Other Decks in Programming
See All in Programming
Streamlitで実現する自然言語データアプリ開発
ayumu_yamaguchi
1
330
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
450
手動確認はもう限界 〜XCUITestでCustom URL Schemeの遷移を起動種別ごとに自動テストする〜 / Testing Custom URL Schemes with XCUITest
otouto
0
390
20260914 AIエージェント時代のPlatform Engineering LLM基盤とプロダクトの責務境界線
kanfab1
7
2.4k
Turning Architecture into Unit Tests in the AI Era (NSSpain XIV)
steliosf
PRO
1
130
Webの地図
yosuke_furukawa
PRO
6
5k
UnityでSystem.Net.WebSocketsなWebSocketサーバが動かないのでUnity Monoのコードを覗いてみた / about implementing websocket server with unity mono
drumath2237
1
540
SREの越境 / SRE Collaboration
y0hgi
2
300
Androidだけじゃない、DroidKaigiで広がった私の技術スタック
akkeylab
0
110
AWSに止められる覚悟してますか?
morizo_1984
2
510
Starting & Sustaining Code-Based E2E Testing for Non-Coding QA Teams( #jasstniigata )
teyamagu
PRO
1
880
Are APIs Still Relevant in the AI Era?
soyuka
0
410
Featured
See All Featured
WCS-LA-2024
lcolladotor
0
840
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.5k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
4
1.2k
A Soul's Torment
seathinner
8
3.7k
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
860
Art, The Web, and Tiny UX
lynnandtonic
304
22k
The Pragmatic Product Professional
lauravandoore
37
7.5k
How GitHub (no longer) Works
holman
316
150k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.3k
What does AI have to do with Human Rights?
axbom
PRO
1
2.4k
Transcript
Swift で作って学ぼう!データベース自作入門 iOSDC Japan 2026 @kentkaseda kaseken kaseken 1
スライド1)・原稿2)は公開済み 1) https://speakerdeck.com/kaseken/iosdc2026 2) https://github.com/kaseken/db.swift/blob/main/docs/iosdc2026.md 2
データベースを “使った” ことがある人 3
データベースを “作った” ことがある人 4
本日の目標 この場にいる全員に データベースの自作をトライさせること 5
なぜデータベースの自作をオススメするのか? 6
なぜデータベースの自作をオススメするのか? ① 技術領域によらない 7
なぜデータベースの自作をオススメするのか? ② 時代によらない 8
以下のプロンプトを実行! > https://cstack.github.io/db_tutorial の内容をSwiftで実装してください ただし、クエリの形式はSQLに準拠してください Thanks to @cstack for
this great tutorial! 9
AIを使うのはずるくない?🤔 10
これなら全員できますよね?🤗 11
私の場合... チャプターごとにAIで実装 生成されたコードをレビュー 次のチャプターへ 腑に落ちるまで AIに質問 & リファクタリング Ref) https://github.com/kaseken/db.swift
12
13
14
15
16
17
こちらのやり方を紹介しました データベースを自作する! データベースの仕組みを理解する! 18
データベースを自作する! データベースの仕組みを理解する! これから説明 19
アーキテクチャ SQL SQLパーサー 命令 B+Tree データの取得・更新 ページャー データの取得・永続化 ファイル 20
アーキテクチャ SQL SQLパーサー 命令 B+Tree データの取得・更新 ページャー データの取得・永続化 👉 ファイル
21
ファイル ページ 0 ページ 1 ページ 2 ページ 3 4096バイト
22
ファイル ページ 0 ページ 1 ページ 2 ページ 3 レコード
0 レコード 1 レコード 2 レコード 3 23
ファイル ページ 0 ページ 1 ページ 2 ページ 3 レコード
0 レコード 1 レコード 2 レコード 3 カラム1 (id) カラム2 (name) カラム3 (email) 24
SwiftDataでもファイルに保存される 25
👇 データベースのファイル 26
行指向DB (e.g. MySQL) カラム ① カラム ② カラム ① カラム
② 列指向DB (e.g. BigQuery) カラム ① カラム ① カラム ① カラム ① ︙ カラム ① カラム ② カラム ① カラム ② ︙ カラム ② カラム ② カラム ② カラム ② ︙ 27
アーキテクチャ SQL SQLパーサー 命令 B+Tree データの取得・更新 👉 ページャー データの取得・永続化 ✅
ファイル 28
B+Tree ページ ページャー メモリ ディスク ページ ファイル 29
B+Tree ページ ページャー メモリ ページ ディスク ファイル 30
キャッシュ ページ 0 ページ 1 nil nil 31
B+Tree ページ2ください ページャー キャッシュ ページ 0 ページ 1 nil nil
ページ2ください ファイル ページ 0 ページ 1 ページ 2 ページ 3 32
B+Tree ページ 2 ページャー キャッシュ ページ 0 ページ 1 ページ
2 nil ページ 2 ファイル ページ 0 ページ 1 ページ 2 ページ 3 33
B+Tree ページ 2 ページャー キャッシュ ページ 0 ページ 1 ページ
2 nil ページ 0 ページ 1 ページ 2 ページ 3 ファイル 34
B+Tree ページャー キャッシュ ページ 0 ページ 1 ページ 2 nil
flush ファイル ページ 0 ページ 1 ページ 2 ページ 3 35
アーキテクチャ SQL SQLパーサー 命令 👉 B+Tree データの取得・更新 ✅ ページャー データの取得・永続化
✅ ファイル 36
B+Treeは、内部ノード・リーフノードの 2種類のノードを持つ 内部ノード 内部ノード リーフノード リーフノード 内部ノード リーフノード リーフノード リーフノード
37
各ノードは、一ページ分のデータを持つ リーフノード 内部ノード ? ? 38
B+Tree ページ ページャー メモリ ディスク ページ ファイル 39
B+Treeのノード ページ ページ ページャー メモリ ディスク ページ ファイル 40
各ノードは、一ページ分のデータを持つ リーフノード 内部ノード ? ? 41
リーフノードは、レコード一覧を保持 ページ キー レコード キー レコード キー レコード 42
キーによってソートされている ページ 2 レコード 5 レコード 8 レコード 43
内部ノードは、子ノードへのポインタとキーの最大値を保持 ページ #1 子ノード #1 #1の最大キー #2 子ノード #2 #2の最大キー
#3 子ノード #3 44
子ノードに含まれるキーの最大値が、親の内部ノードに保持される #1 10 #1の最大キー レコード 13 #2 レコード 17 #3
17 レコード 45
子ノードに含まれるキーの最大値が、親の内部ノードに保持される #1 #1の最大キー #2 35 #3 #3に含まれる キーの最大値 #1 8
#2 17 #3 46
キーの最大値はソートされている #1 子ノード #1 8 #2 子ノード #2 17 #3
子ノード #3 47
19 21 22 #1 17 #2 35 #3 #1 22
#2 29 #3 24 26 29 30 31 35 48
子ノードに含まれるキーの最大値が、親の内部ノードに保持される 19 21 22 #1 17 #2 35 #3 #1
22 #2 29 #3 24 26 29 30 31 35 49
#1 8 #2 17 #3 子ノード #1 子ノード #2 子ノード
#3 8以下 9以上・17以下 18以上 50
キーが12のレコードを検索する場合 ... #1 子ノード #1 8 #2 子ノード #2 17
#3 子ノード #3 9以上・17以下 51
内部ノードは、 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
アーキテクチャ 👉 SQL SQLパーサー 命令 ✅ B+Tree データの取得・更新 ✅ ページャー
データの取得・永続化 ✅ ファイル 53
SELECT * FROM users WHERE id = 24 SQLパーサー id
= 24のレコードを検索 B+Tree 54
id = 24のレコードを検索 B+Tree #1 17 #2 35 #3 ルートノードのページを取得
ページャー (未キャッシュの場合) ページを取得 ファイル 55
id = 24のレコードを検索 B+Tree #1 17 #2 35 #3 #2に含まれる
(18以上・35以下) 56
id = 24のレコードを検索 B+Tree #1 17 #2 35 #3 #1
22 #2 29 #3 ノードのページを取得 ページャー (未キャッシュの場合) ページを取得 ファイル 57
id = 24のレコードを検索 B+Tree #1 17 #2 35 #3 #1
22 #2 29 #3 #2に含まれる (23以上・29以下) 58
id = 24のレコードを検索 B+Tree 24 #1 17 #2 35 #3
#1 22 #2 29 #3 レコード 26 レコード 29 レコード ノードのページを取得 ページャー 59
id = 24のレコードを検索 B+Tree 検索結果 24 #1 17 #2 35
#3 #1 22 #2 29 #3 レコード 26 レコード 29 レコード 60
INSERT INTO users (id,username,email) VALUES (27,'foo','
[email protected]
') SQLパーサー id = 27のレコードを追加
B+Tree 61
id = 27のレコードを追加 B+Tree 24 #1 17 #2 35 #3
#1 22 #2 29 #3 レコード 26 レコード 29 レコード ここに追加すべき 62
id = 27のレコードを追加 B+Tree 24 レコード #1 17 #2 35
#3 #1 22 #2 29 #3 26 レコード 27 レコード 29 レコード 追加された 63
アーキテクチャ ✅ SQL SQLパーサー 命令 ✅ B+Tree データの取得・更新 ✅ ページャー
データの取得・永続化 ✅ ファイル 64
データベースを自作する! データベースの仕組みを理解する! 65
データベースを自作する! データベースの仕組みを理解する! もっと学びたい方にはCMUの講義1)がおすすめ 1) カーネギーメロン大学の有名講義『 Intro to Database Systems』を全てのプログラマに見てほしい 66
皆さんへの宿題です! データベースを自作する! データベースの仕組みを理解する! 67
ぜひDBの自作に挑戦してみてください! > https://cstack.github.io/db_tutorial の内容をSwiftで実装してください ただし、クエリの形式はSQLに準拠してください Thanks to @cstack for this
great tutorial! 68