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
160
はやい開発のためのJSONデータ型の活用
sunnyone
August 24, 2023
Tweet
Share
More Decks by sunnyone
See All by sunnyone
概念モデル→論理モデルで気をつけていること
sunnyone
3
290
印象に残ったLLMの使い方5選
sunnyone
0
18
シンプルじゃないテーブルの見つけ方
sunnyone
1
340
Next.js App Router登場後の話
sunnyone
0
70
フロントエンドトレンドのふりかえりと事業に合わせた選択
sunnyone
0
110
メタプログラミングとは
sunnyone
0
2.3k
RustからPythonを呼び出す
sunnyone
1
4.5k
PowerShellでRazorテンプレートエンジンを使ってみた
sunnyone
0
2.7k
Other Decks in Programming
See All in Programming
ユーザーも開発者も悩ませない TV アプリ開発 ~Compose の内部実装から学ぶフォーカス制御~
taked137
0
180
複雑なドメインに挑む.pdf
yukisakai1225
5
1.2k
1から理解するWeb Push
dora1998
7
1.9k
Performance for Conversion! 分散トレーシングでボトルネックを 特定せよ
inetand
0
2.4k
旅行プランAIエージェント開発の裏側
ippo012
2
920
より安全で効率的な Go コードへ: Protocol Buffers Opaque API の導入
shwatanap
1
320
意外と簡単!?フロントエンドでパスキー認証を実現する WebAuthn
teamlab
PRO
2
770
AIを活用し、今後に備えるための技術知識 / Basic Knowledge to Utilize AI
kishida
22
5.8k
請來的 AI Agent 同事們在寫程式時,怎麼用 pytest 去除各種幻想與盲點
keitheis
0
120
知っているようで知らない"rails new"の世界 / The World of "rails new" You Think You Know but Don't
luccafort
PRO
1
180
The Past, Present, and Future of Enterprise Java with ASF in the Middle
ivargrimstad
0
150
GitHubとGitLabとAWS CodePipelineでCI/CDを組み比べてみた
satoshi256kbyte
4
240
Featured
See All Featured
Code Review Best Practice
trishagee
71
19k
Art, The Web, and Tiny UX
lynnandtonic
303
21k
Build The Right Thing And Hit Your Dates
maggiecrowley
37
2.9k
What's in a price? How to price your products and services
michaelherold
246
12k
Typedesign – Prime Four
hannesfritz
42
2.8k
Being A Developer After 40
akosma
90
590k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Optimising Largest Contentful Paint
csswizardry
37
3.4k
Practical Orchestrator
shlominoach
190
11k
The Art of Programming - Codeland 2020
erikaheidi
56
13k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
Side Projects
sachag
455
43k
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