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
SQLアンチパターンから学ぶテーブル設計
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
あけの
May 28, 2022
Programming
800
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
SQLアンチパターンから学ぶテーブル設計
あけの
May 28, 2022
More Decks by あけの
See All by あけの
Reactハンズオンラーニングを読んだので感想を語る
akeno
1
740
TypeScriptのエラー処理(ES2022の新機能を添えて)
akeno
3
3.1k
oapi-codegenを使ってみた
akeno
0
3k
こんな案件は嫌だ(※個人の感想です)
akeno
1
260
VSCode Remote Containers のすすめ
akeno
0
380
設計とテストの必要性について考える
akeno
1
330
Other Decks in Programming
See All in Programming
あなたの await、OS まで届いてる? strace で覗く JavaScript の非同期
hasutosasaki
1
2.3k
AI駆動開発4年目の現在地(『あなたはFDEになるべきか?』イベント資料)
kumaiu
0
510
Zero-Tap Sign-In対応、結局何をすればいいの?
mitohato14
0
1.9k
高橋メソッドでCVE解説シリーズ 〜CVE-2026-112816〜
hakkadaikon
0
230
Engineering Biometric UX Across Android Versions | DroidKnights 2026
ryunen344
1
190
作れる、でも消せるか?──安全に「枯らして消す」機能削除術 / Drain, Then Delete
chobishiba
3
1.5k
Secure Your Coding Agent Like It’s Malware (v1.5) 🇬🇧 @Code.talks 2026
richargh
0
110
動画プレイヤーはなぜカクつくのか 〜Flutterのレンダリングとネイティブの境界を解剖する〜
naruogram
0
330
作って学ぶSpring BootのAuto Configuration / JJUG Night Seminar 2026-10-19
rshindo
0
220
作れるエンジニアから、価値を届けるエンジニアへ
ryunakayama
1
250
Seven New Principles of Software Engineering
yegor256
0
470
S3 TablesのIcebergデータに、AIエージェントからアクセスしてみた / 20261016developersio2026joetsu-accessing-iceberg-in-s3tables-via-agent
kasacchiful
PRO
0
300
Featured
See All Featured
Docker and Python
trallard
47
4.3k
Technical Leadership for Architectural Decision Making
baasie
3
640
Documentation Writing (for coders)
carmenintech
77
5.6k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
470
Amusing Abliteration
ianozsvald
1
380
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
630
Context Engineering - Making Every Token Count
addyosmani
9
1.3k
Building AI with AI
inesmontani
PRO
1
1.4k
ラッコキーワード サービス紹介資料
rakko
5
5.8M
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
1k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.5k
Transcript
@akeno_0810 2022.05.28 SQLアンチパターン から学ぶテーブル設計 ココカラ勉強会 No.9
自己紹介 About me akeno (@akeno_0810) Webエンジニア歴2年くらい Rust, API/コード設計, DevOps/開発の効率化 触っている技術
最近興味のある分野
SQLアンチパターン
SQLアンチパターン リレーショナルデータベースを使う際のアンチパターンP B 論理設# B 物理設# B クエ B アプリケーション
の4種類、25パターン 実際に出会ったパターンをピックアップして紹介 (スマホでスキャンしたので画像が雑です)
論理設計 Entity Attribute Value ポリモーフィック
Entity Attribute Value 可変属性をサポートする方法 KVSのようにRDSでも柔軟なデータ構造を持ちたい… カラム名を用いた検索が出来な 入っている値はアプリケーションが保 証する必要があx
構造をプログラマが管理しなければな らない
Entity Attribute Value 基本的には向いてないので、ある程度の種類に絞れる場合を考える シングルテーブル継 e ひたすらカラムを増やb e NULLが入るカラムが多くなる 具象テーブル継
e テーブルを完全に分けV e 共通データとして扱いづらい クラステーブル継 e 共通部と個別部のテーブルを分けV e 共通部の切り出しが難しい・参照が面倒
ポリモーフィック シングルテーブル バリエーションのあるテーブルに関連を持たせたい場合 クラステーブル 具象テーブル(Bad) 具象テーブル(Good) Commentsテーブルに どちらのテーブルを参 照するか(メタデー タ)を持たせるという
パターンが辛い
Entity Attribute Value / ポリモーフィック 経験談と感想 KVSの形はマスターデータを保存する場合はありだと思う EAVはなんだかんだ見ることが多いが、コメントなしでは誰も読めないことも多い →できる限り避けていきたい気持ち 商品と特定の属性が追加された商品のパターンは見たことがある
メタデータがデータに混入する問題・柔軟性は怖い ORMを使ったら実装していいって書いてるけど、それでも辛かった 結局用途に寄るのだが、シングルテーブルorクラステーブルを使いたくなる
物理設計 31のフレーバー
31のフレーバー 限られた値のみを格納するカラムを作成する方法 ステータスや性別等、限られた値を保持する際にENUMを使ってしまうとV P 既存の値リストがわからなE P 追加がしづらE P 移植しづらい といった問題が発生する。
解決策としてはマスターテーブルからデータ参照して外部キーで縛ること。
31のフレーバー 経験談と感想 出来るだけマスターテーブルを用いていきたい。 入る値が一覧できるのと、値を縛れるのが有用。 この辺をアプリケーション側で担保するのは面倒。 tinyint型で管理する手もあるが、コメントが無くて分からなくなるパターンがある。 柔軟性を求めるならありだが、柔軟性とアンチパターンは紙一重。 けどマスターテーブル管理が面倒で数値や文字列に逃げることはまあまあある… ドキュメントやコメントでしっかり補完しておきましょう。
クエリ フィア・オブ・ジ・アンノウン
フィア・オブ・ジ・アンノウン NULLを使わない方法 unknownな値が怖い NULLとの比較はかなり特殊。 あまり使いたくないし、使う際は NULLと比較される可能性を考慮 したクエリを組む必要がある。 UNIQUE制約に縛られない点から も値としては見てない。
フィア・オブ・ジ・アンノウン 経験談と感想 出来るだけデフォルト値を用いていきたい。 NULLは何もないという特別な状態を示すために使う。 カラムを増やす際にNULL許可デフォルト値なしのマイグレーションがあった。 アプリケーションは動かなくなった。 column_nane != ‘検索文字列’ というクエリをnull許可のカラムに掛けていた。
期待より少なめの検索結果となった。
アプリケーション開発 リーダブルパスワード
リーダブルパスワード パスワードを安全に保存する方法 パスワードを平文で保存していたので閲覧が簡単に出来てしまった… 平文はなかなか無いと思うが、それ以外でW r SQLに平文のパスワードを入れてSQLでHash化していI r Saltがな r Hash化回数が不十C
r 復号の必要がないが、復合可能 あたりは踏みやすい。 DBとは関係ない部分の注意点が多い。
リーダブルパスワード 経験談と感想 復合可能な情報を持つのは怖い。 Hash化回数が少ない場合、Saltが使われていない場合も怖い。 復合可能にするという要件があったので、実装したことはある。 keyとiv(初期化ベクトル)の扱い、大事。 パスワードのHash化は大抵の言語に専用のライブラリがあると思うので使おう。 Goだと`bcrypt.GenerateFromPassword()`がお手軽。 普通のHash関数を使って自前で実装するメリットは薄いと思う。
まとめ
Thank you! 参考資料 SQLアンチパターン https://www.oreilly.co.jp/books/9784873115894/ 読みやすい本だったので是非どうぞ(半日くらいで読めた) 25パターン中21の問題を経験していたので、早めに読んでおくとかなり役立ちそう (特に前半の論理設計/物理設計) 概要をまとめた記事をよく見るのでざっと眺めてみるのもあり (ネットの記事でほぼ全ての情報が出ている気がする…)
RDB、正しく使えばアプリケーション側の負担が減ります