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
sunnyone
August 24, 2023
Programming
0
81
はやい開発のためのJSONデータ型の活用
sunnyone
August 24, 2023
Tweet
Share
More Decks by sunnyone
See All by sunnyone
Next.js App Router登場後の話
sunnyone
0
23
フロントエンドトレンドのふりかえりと事業に合わせた選択
sunnyone
0
76
メタプログラミングとは
sunnyone
0
2k
RustからPythonを呼び出す
sunnyone
1
4k
PowerShellでRazorテンプレートエンジンを使ってみた
sunnyone
0
2.3k
Other Decks in Programming
See All in Programming
PostmanでAPIの動作確認が楽になった話
h455h1
0
170
初心者のためのRubyKaigi入門/RubyKaigi Introduction
a_matsuda
4
940
サイコロで理解する統計的仮説検定の考え方
tatamiya
4
950
2 週間で Twitter Bot を作ってみた
contour_gara
0
600
Fragment Composition of GraphQL
quramy
7
1k
デフォルトにして至高、RubyMineの大好きな所
ruzia
0
430
Netty Chicago Java User Group 2024-04-17
sullis
0
180
Random\Randomizer クラスで日常のあれこれを解決しよう! / Random\Randomizer class solves familiar trouble
cocoeyes02
0
250
はてなにおける CSS Modules、及び CSS Modules に足りないもの / CSS Modules in Hatena, and CSS Modules missing parts
mizdra
7
940
TCAとKMPを用いた新規動画配信アプリ 「ABEMA Live」の設計
tomu28
1
110
OpenAPIを中心に考えるAPI開発入門 / Introduction to API Development with a Focus on OpenAPI
seike460
PRO
2
170
MetricKitで予期せぬ終了を検知する話 / Detect unexpected termination with MetricKit
nekowen
1
190
Featured
See All Featured
Optimising Largest Contentful Paint
csswizardry
8
2.4k
What's in a price? How to price your products and services
michaelherold
237
11k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
659
120k
Adopting Sorbet at Scale
ufuk
68
8.6k
Designing on Purpose - Digital PM Summit 2013
jponch
110
6.5k
Fireside Chat
paigeccino
21
2.6k
A Modern Web Designer's Workflow
chriscoyier
689
190k
4 Signs Your Business is Dying
shpigford
175
21k
Why Our Code Smells
bkeepers
PRO
331
56k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
2
1.3k
VelocityConf: Rendering Performance Case Studies
addyosmani
320
23k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
40
4.4k
Transcript
はやい開発のための JSON データ型の活用 1
アジェンダ JSON 型とは JSON 型のメリット JSON 型の運用上の課題と対策 結論 2
JSON 型とは RDB に備わっているJSON を格納するためのデータ型 json 型やjsonb 型 JSON のための関数もある
->> 演算子, json_array_elements, etc 今回はRDB の機能自体については触れません 3
JSON 型のメリット 可変の構造を入れられる int やtimestamp などはそれぞれのもの ???「決めなくていい!早くできる!!」 4
JSON の例 { "title": "SQL アンチパターン", "author": "Bill Karwin" }
5
JSON 型の運用上の課題:構造が変わる ???「タイトルの一部を太字にしたいんですけど」 { "title": [ { "text": " 失敗",
"type": "strong" }, { "text": " から学ぶRDB の正しい歩き方" }, ], "author": " 曽根 壮大" } 6
JSON 型の運用上の課題への対策 マイグレーションする 互換性がある構造にする 複数バージョンに対応する 7
対策 1. マイグレーションする クエリー一発というわけにいかないことが多い 変換ロジックの実装が必要 実装の時間がかかる 変換が難しい構造になることがある 木の一部にあるような例だと辿るのも大変 8
対策 2. 最初から柔軟性のある構造にする ある程度変更を見越しておく。 { "title": [ { "text": "SQL
パズル" }, ], "author": " ジョー・セルコ" } → 想定するにも限界がある 9
対策 3. 複数バージョンに対応する 複数の形のデータを排除することは諦め、ロジックがどちらの値も 想定する 10
複数バージョンの罠 本来の目的の中に今の実装にない過去データの構造が入り込む 開発速度を下げる function BookBox({title}) { if (title instanceof string)
{ // こういうのが増えていく return <Box><div>{title}</div></Box>; } // 本来は見た目をどうにかするのが役割 return <Box><DecoratedText text={title} /></Box>; } 11
罠の原因と対策 本来の業務の役割に、永続化されたデータを解釈する役割が重なっ ている データを保存する目的と表示する目的が異なることも多い 複数バージョンを想定する場合は、データを解釈する層を用意する 最初からデータをそのままで使えないことを想定した構成にして おく 後付けで一貫して足すことは大変なことに注意 12
例 こういう層を書けるようにしておくと、本来の役割に集中できる function parseFooData(bookData): Data { if (bookData instanceof string)
{ return [ { text: bookData.title } ]; } return bookData; } function BookBox({book}) { return <Box><DecoratedText text={title} /></Box>; } 13
JSON 型、 ほんとうにはやかったのだろうか? 14
結論 RDB を使えるなら使う方がはやくない? マイグレーションのための仕組みがある データに対する制約をかけやすい 変なデータが入っていることを想定する必要性が下がる 制約によってはアンチパターン: EAV(Entity Attribute Value)
も考慮 を JSON を使わなければいけないときは覚悟をもって使いましょう 15