Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Json型の使い方
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
tsuda.a
September 04, 2017
Programming
0
51
Json型の使い方
JSON型と正規形の両立について検討してみました。
tsuda.a
September 04, 2017
Tweet
Share
More Decks by tsuda.a
See All by tsuda.a
マジカルインクリメントと指数表記
tsudaahr
0
220
バックアップしていますか?
tsudaahr
0
130
RDB以前のファイル設計の話でもしようか(ぇ
tsudaahr
0
140
NPUわからん
tsudaahr
0
190
計算量オーダーの話
tsudaahr
1
420
クラウド初学者が抱える不安について
tsudaahr
0
300
キューとは何か
tsudaahr
0
260
等幅は死んだ(ぇ
tsudaahr
0
110
いくら眺めてもエラーの理由がわからないコードについて
tsudaahr
0
200
Other Decks in Programming
See All in Programming
React 19でつくる「気持ちいいUI」- 楽観的UIのすすめ
himorishige
11
7.4k
AtCoder Conference 2025
shindannin
0
1.1k
組織で育むオブザーバビリティ
ryota_hnk
0
180
疑似コードによるプロンプト記述、どのくらい正確に実行される?
kokuyouwind
0
390
AI によるインシデント初動調査の自動化を行う AI インシデントコマンダーを作った話
azukiazusa1
1
740
Rust 製のコードエディタ “Zed” を使ってみた
nearme_tech
PRO
0
190
なぜSQLはAIぽく見えるのか/why does SQL look AI like
florets1
0
470
副作用をどこに置くか問題:オブジェクト指向で整理する設計判断ツリー
koxya
1
610
15年続くIoTサービスのSREエンジニアが挑む分散トレーシング導入
melonps
2
220
Smart Handoff/Pickup ガイド - Claude Code セッション管理
yukiigarashi
0
140
インターン生でもAuth0で認証基盤刷新が出来るのか
taku271
0
190
カスタマーサクセス業務を変革したヘルススコアの実現と学び
_hummer0724
0
710
Featured
See All Featured
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
150
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
0
180
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
9.5k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.2k
GraphQLの誤解/rethinking-graphql
sonatard
74
11k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
120
Art, The Web, and Tiny UX
lynnandtonic
304
21k
How to train your dragon (web standard)
notwaldorf
97
6.5k
Typedesign – Prime Four
hannesfritz
42
2.9k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.6k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.6k
Transcript
JSON型の使い方 (SQLアンチパターンを超えて) @tsuda_ahr 2016/7/2
ジェイ・ウォーク (信号無視) • 略 • 「SQLアンチパターン (オライリー刊)」 を 読んでください。
そんなとき、PostgreSQLer (?) からは • ポスグレなら、配列型があるよ! • ポスグレなら、JSON 型があるよ! という話を聞くのですが。
それって、第一正規形違反じゃね? • カラムに非スカラ値を持つので、第一正規形違反。 • 要するに正規化の第一歩目からつまづいてる。
ところで第一正規形とは? • テーブルが繰り返しグループを持たない。 • 配列、リスト、テーブル内テーブル、レコード構造を持たない。 • すべての列がスカラ値である。 (スカラ値とは、それ以上分解不可能な原子的な値のこと)
つまり • 配列型やJSON型を使う時点で、非正規形に堕ちる。 • リレーショナルな設計はどこへ? • 配列型やJSON型を使うことは、リレーショナルモデルが解決しようとしたものを壊すのでは?
正規化の目的を確認 • 正規形とは、データベースにおいて正しいデータを破壊しないこと、または間違ったデー タを作らないことを保証するための試みである。 そうしたエラーを回避するための方法の 1つは、データベースにおいて1つの事実を1つ の場所にだけ格納することだ。 • というのも、もし1つの事実が2つの場所に現れるとしたら、更新の際に正しく同期を取 らないと不整合が起きることになる
• 2つの腕時計をしている人間は、どちらが正しい時刻を指しているのかという不安に常 につきまとわれる。だから我々は、多くの時計を1つのマスタとなる時計に同期させ、1 つのデータソースから派生するビューとして扱うのだ。 「プログラマのためのSQL 第4版 (翔泳社刊)」 の 9章「正規化」より引用
なので今回は • 配列型やJSON型を、リレーショナルモデルに反しないように使うためにはどうすればよい か?を考えてみる。
ところで、落ち着いて考えてみると • 標準SQL (SQL92以前) でも認められている非スカラ値がある。
CHAR や VARCHAR, あるいは TEXT • 非スカラ値 (配列値相当) なのに、スカラ値 (単一値)
扱い。 • 文字列は最近の言語では string ですが、C では char[] ですし、 Haskell とかも文字の集合 (list) として扱ったりしますね?
あるいは LOB (Large Object) • ファイルや画像。これも Byte 配列。 • SQL
標準としては、配列型が認められた SQL99 からの型だが、 配列型や JSON 型のように、正規化の問題として語られることはない。
配列型やJSON型と、文字列型,LOB型の違いはなにか • 一つの値として取得しているところ。
たとえば、 • 一般に、文字列の一部だけを (DBで) 検索することはない。
いやまあ、できますよ?確かに。 • select ENAME from EMP where substr(ENAME,2,1) = 'A';
• select ENAME from EMP where regexp_like(ENAME, 'L.*K', 'i') ; (↑oracle の場合) でも、こんなことすると遅いし! ポスグレには 「関数インデックス」 という機能があるから速くできるよ!
でも普通やらないよね? • つまり、配列だろうとなんだろうと、その集合を「ひとつの値」としてみなせる場合は、 第一正規形に違反していない、といえる。
「ひとつの値」としてみなせる場合、とはどんな場合か? • 例えば、会社から自宅までの経路測定のデータ列。 • 例えば、将棋盤のコマの配置状況。
ダメな場合 (「ひとつの値」としてみなせない場合) • 要素の一部と、他のテーブルを結合したい (外部キー制約) を張りたい場合 • 要素の一部分を検索,更新したい場合
厳密な境界線はあるのか? • ない • バランスを失うと、ジェイウォークにもあるように、「文字列型」に複数の要素を突っこむの と同じことが起こり得る。 • これはデータベースの型がスカラ値か非スカラかという問題ではなく、値の設計の問題。 整数型であっても、例えば桁に意味を持たせるようなことをすれば同じ問題が生ずる。
配列型やJSON型を使うための基準 • データ型は非スカラ値でも、それをスカラ値のような扱える場合はアリ。 • 部分のデータを、他のテーブルのデータと関連を持たせるような設計は不可。 • 文字列型を参考すると解が見えやすい。(バランスがとりやすい)
結論 • ご利用は計画的に。
もし「もっと良い基準があるよ!」って人がいたら。 • ぜひ教えてください!