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
PostgreSQLで学ぶリレーショナルデータモデルとその実装
Search
Akira Suenami
May 01, 2016
Technology
1
890
PostgreSQLで学ぶリレーショナルデータモデルとその実装
中国DB勉強会でのトーク資料です。
Akira Suenami
May 01, 2016
Tweet
Share
More Decks by Akira Suenami
See All by Akira Suenami
オブジェクト指向考古学 〜人類は再びDCIの夢を見るか〜
a_suenami
5
1.5k
トランザクションスクリプトはどこから来たのか トランザクションスクリプトは何者か トランザクションスクリプトはどこへ行くのか #sekkeinight
a_suenami
12
5.4k
値と属性の話
a_suenami
0
160
ドメインモデラーにとって受託開発であることは制約なのか?
a_suenami
1
1.3k
異なるモデリングパラダイムから見るモデリングの勘所 #ooc_2020
a_suenami
2
2.7k
マルチパラダイムモデリング 〜異なるモデリングパラダイムから見るモデリングの勘所〜 #PHPerKaigi
a_suenami
0
3.6k
“ユーザーファースト”の功罪 〜分析と実験によるアーキテクチャ設計〜 #bpstudy
a_suenami
4
1.2k
ドメインモデルのつくり方 #5000dai
a_suenami
16
4.6k
ビジネスの構造を扱うアーキテクチャとユーザとの接点を扱うアーキテクチャ #builderscon
a_suenami
46
11k
Other Decks in Technology
See All in Technology
Azure Pipelinesを使用したCICDベースラインアーキテクチャ実践
yuriemori
0
190
[NIKKEI Tech Talk] KDDI/KAG Scrum & Community for Engineering Training
curanosuke
2
220
Docker互換のセキュアなコンテナ実行環境「Podman」超入門
devops_vtj
6
3.2k
[NIKKEI Tech Talk]Bias for Action!! 実践から学ぶための仕組とコミュニティ / Community for Practice and Learning
kanamasa
0
260
ここがすごいよ! AWS Systems Manager!
saichan11
0
1.8k
データ分析を支える技術 生成AI再入門
ishikawa_satoru
0
380
クラウド利用者の「責任」をどう果たす?AWSセキュリティ対策のススメ #AWSSummit
hiashisan
0
270
エンジニアリングマネージャーはどう学んでいくのか #devsumi / How Do Engineering Managers Continue to Learn and Grow?
expajp
4
1.3k
GoとアクターモデルでES+CQRSを実践! / proto_actor_es_cqrs
ytake
1
150
ソフトウェアエンジニアリングの知見を活かして データ基盤をいい感じにする on Snowflake [MIERUNE BBQ #10]
mtpooh
2
150
大規模ドラレコデータ収集・機械学習基盤を支える AWS CDK 〜導入・運用事例紹介〜
pemugi
0
110
AIエージェントを現場に導入する目線とは
masahiro_nishimi
1
1.5k
Featured
See All Featured
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
353
29k
GitHub's CSS Performance
jonrohan
1026
450k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
12
3.8k
Bootstrapping a Software Product
garrettdimon
PRO
304
110k
A Philosophy of Restraint
colly
200
16k
A better future with KSS
kneath
231
17k
Art, The Web, and Tiny UX
lynnandtonic
291
20k
It's Worth the Effort
3n
181
27k
Building Flexible Design Systems
yeseniaperezcruz
323
37k
Learning to Love Humans: Emotional Interface Design
aarron
269
39k
Designing for Performance
lara
604
67k
A Tale of Four Properties
chriscoyier
155
22k
Transcript
PostgreSQLͰֶͿ ϦϨʔγϣφϧσʔλϞσϧͱͦͷ࣮ Twitter: @a_suenami Github: a-suenami id: a_suenami
໔ࣄ߲ • ຊൃදͷ༰ࢲݸਓͷݟղͰ͋Γɺॴଐ͢Δ৫ɾஂମͷݟղΛ ඞͣ͠өͨ͠ͷͰ͋Γ·ͤΜɻྃ͝ঝ͍ͩ͘͞ɻ
ࣗݾհ • ฒ ߊʢ͑͢ͳΈ ͖͋Βʣ • @a_suenami • ͖ͳͷ RDB
ͱ͔ΦϒδΣΫτࢦͱ͔ TDD ͱ͔ɻ • ࠷࣭ۙܯͱͯ͠׆ಈதɻ
ࣄ ঁͷࢠͷ͔Θ͍͍Λ࡞ͬͯ·͢ɻ
ຊൃදͷత • PostgreSQL Λ͡Ίͱ͢ΔϦϨʔγϣφϧσʔλϕʔεʢ RDB ʣ ͷࠜװΛ͢ϦϨʔγϣφϧσʔλϞσϧʹ͍ͭͯཧղͯ͠Β͏ɻ • RDB ͦΕʹର͢Δ͍߹Θͤݴޠͱͯ͠ͷ
SQL ϦϨʔγϣφϧ σʔλϞσϧΛϕʔεʹ͠ͳ͕ΒɺͦΕҎ্ʹศརʹ͏ͨΊʹଟ ͘ͷՃ࣮͕͋Δ͜ͱΛཧղͯ͠Β͏ɻ • PostgreSQL ΛྫʹͱͬͯɺϦϨʔγϣφϧσʔλϞσϧ͓ΑͼͦΕ Ҏ֎ͷ࣮ʹ͍ͭͯͬͯΒ͏͜ͱɻ
·ͣࠓ͜ͷձʹ Ͳ͏͍͏ਓ͕͍Δͷ͔Γ͍ͨͰ͢
ֶੜͷਓ ϊϊϊ
ʢݚڀۀͰʣ গͳ͘ͱͻͱͭҎ্ͷRDBMS Λ ͬͨܦݧ͕͋Δਓ ϊϊϊ
ϦϨʔγϣφϧσʔλϞσϧͬͯ Կ͔ͬͯΔਓ ϊϊϊ
͋Γ͕ͱ͏͍͟͝·͢ɻ ࢀߟʹ͠·͢ɻ
ϦϨʔγϣφϧσʔλϞσϧ
None
ϦϨʔγϣφϧσʔλϞσϧͷجૅ • ͋Δࣄʹؔ͢Δࣄ࣮ͷू߹ʢ=ϦϨʔγϣϯʣΛѻ͏σʔλϞσ ϧɻ • ϦϨʔγϣϯ ≠ ϦϨʔγϣϯγοϓ • ϦϨʔγϣϯʢؔʣͱɺRDB
ʹ͓͚Δςʔϒϧؒͷؔʢࢀ রɺ֎෦ΩʔʣͰͳ͘ɺςʔϒϧͷΧϥϜؒͷؔɺͭ·Γςʔ ϒϧͦͷͷͷ͜ͱͰ͋Δɻ
ೋ߲ؔͱड़ޠཧͱϦϨʔγϣϯ • ͋Δ 2 ͭͷू߹ͷཁૉ x, y ͷΈ߹Θ͕ͤ͋Δ݅ R Λຬͨ͢߹ɺʮx
ͱ y R ͷؔʹ͋Δʯͱ͍͍ɺ͜ͷΈ߹Θͤͷू߹Λೋ߲ؔͱ͍͏ɻ • ྫ: x + y = 3 ͱͳΔΑ͏ͳࣗવͷू߹ • (0, 3), (1, 2), (2, 1), (3, 0) • ϦϨʔγϣφϧσʔλϞσϧ͜ΕΛ n ߲ʹ֦ுͨ͠ͷͰ͋Δɻ • ͕ͨͬͯ͠ɺϦϨʔγϣϯͷ֤ཁૉ n ࣍ݩ্ۭؒͷ͋Δ࠲ඪΛද͢͜ͱʹ ͳΔɻ • ॏෳͳ͍ɻ • ॱংͳ͍ɻ
ؔԋࢉ • ੍ݶʢ Restrict ʣ • ࣹӨʢ Project ʣ •
ʢ Union ʣ • ੵʢ Intersect ʣ • ੵʢ Product ʣ • ݁߹ʢ Join ʣ
੍ݶ ձһ൪߸ ໊ ྸ ฒ ߊ
ࢁా ଠ ాத Ֆࢠ ࠤ౻ ձһ൪߸ ໊ ྸ ฒ ߊ ࠤ౻
ࣹӨ ձһ൪߸ ໊ ྸ ฒ ߊ
ࢁా ଠ ాத Ֆࢠ ࠤ౻ ձһ൪߸ ໊ ฒ ߊ ࢁా ଠ ాத Ֆࢠ ࠤ౻
ձһ൪߸ ໊ ྸ ฒ ߊ
ࢁా ଠ ాத Ֆࢠ ࠤ౻ ձһ൪߸ ໊ ྸ ླ Ұ ߴڮ ࢠ ձһ൪߸ ໊ ྸ ฒ ߊ ࢁా ଠ ాத Ֆࢠ ࠤ౻ ླ Ұ ߴڮ ࢠ
݁߹ ձһ൪߸ ໊ ྸ ಓݝ ฒ ߊ
େ ࢁా ଠ ࢁޱ ాத Ֆࢠ ࢁޱ ࠤ౻ ౡ ಓݝ ݝிॴࡏ ւಓ ࡳຈ ࢁޱ ࢁޱ େ େ ձһ൪߸ ໊ ྸ ಓݝ ݝிॴࡏ ฒ ߊ େ େ ࢁా ଠ ࢁޱ ࢁޱ ాத Ֆࢠ ࢁޱ ࢁޱ ࠤ౻ ౡ ౡ
ੵ • ݁߹ͷಛघͳέʔεɻ • ͯ͢ͷଐੑ͕શʹҰக͢Δ߹ɻ ໊ ฒ ߊ ࢁా
ଠ ాத Ֆࢠ ࠤ౻ ໊ ฒ ߊ ాத Ֆࢠ ໊ ฒ ߊ ాத Ֆࢠ
ੵ • ݁߹ͷಛघͳέʔεɻ • Ұக͢Δଐੑ͕ͻͱͭͳ͍߹ɻ ໊ ฒ ߊ ࢁా
ଠ εΩϧ 1PTUHSF42- .Z42- ໊ εΩϧ ฒ ߊ 1PTUHSF42- ฒ ߊ .Z42- ࢁా ଠ 1PTUHSF42- ࢁా ଠ .Z42-
SQL ͱͷରԠ ؔԋࢉ 42- ੍ݶ 8)&3& ࣹӨ 4&-&$5 6/*0/
݁߹ +0*/
ϦϨʔγϣφϧσʔλϞσϧͱ ਖ਼نԽཧ
Կނਖ਼نԽ͕ඞཁ͔ • σʔλ͕ϦϨʔγϣϯͰදݱ͞Ε͍ͯΕؔԋࢉΛߦͳ͏͜ͱ ՄೳͰ͋Δɻ • ͨͩ͠ɺͦΕσʔλͷ߹ੑΛอূͯ͘͠ΕΔ͜ͱΛҙຯ͢ΔΘ ͚Ͱͳ͍ɻ • ʮԋࢉ͕ՄೳͰ͋Δʯ͜ͱͱʮԋࢉ݁Ռ͕ଥͰ͋Δ͜ͱ͕อূ͞ ΕΔʯ͜ͱҟͳΔɻ
• ਖ਼نԽσʔλͷ߹ੑΛҡ࣋͢Δ্ͰඞཁͳཧͰ͋Δɻ
ਖ਼نԽͷछྨ • ୈ̍ਖ਼نܗ • ୈ̎ਖ਼نܗ • ୈ̏ਖ਼نܗ • ϘΠείουਖ਼نܗ •
ୈ̐ਖ਼نܗ • ୈ̑ਖ਼نܗ • ୈ̒ਖ਼نܗ
༻ޠհ • ީิΩʔ • ϦϨʔγϣϯͷཁૉΛҰҙʹಛఆͰ͖Δଐੑͷू߹ͰɺͦΕҎ্ཁૉΛݮΒ͢͜ͱ͕Ͱ ͖ͳ͍ͷɻ • εʔύʔΩʔ • ީิΩʔͷεʔύʔηοτɻ
• ͯ͢ͷଐੑΛؚΉू߹ৗʹεʔύʔΩʔͰ͋Δɻ • ؔैଐੑ • ϦϨʔγϣϯͷཁૉͷ͋Δଐੑ a ͕ఆ·ͬͨΒผͷଐੑ b ఆ·Δ߹ɺb a ʹؔ ैଐ͢Δͱ͍͏ɻ • ݁߹ैଐੑ • ςʔϒϧΛ݁߹ͨ͠߹ʹݩʹΔΑ͏ʹແଛࣦղͰ͖Δ͜ͱɻ
ୈ̍ਖ਼نܗ • σʔλ͕ϦϨʔγϣϯͰදݱ͞Ε͍ͯΔ͜ͱɻ • ٯʹݴ͏ͱඇਖ਼نܗͷσʔλͦͦϦϨʔγϣφϧσʔλϞσ ϧʹैͬͯͳ͍ͱ͍͏͜ͱʹͳΔɻ • ΧϯϚ۠ΓจࣈྻɺྻɺJSON ͷσʔλؔԋࢉͰѻ͑ͳ ͍ͷͰ͜͏͍ͬͨσʔλ͕ഉআ͞Εͨঢ়ଶ͕ୈ1ਖ਼نܗͰ͋Δɻ
ୈ̎ਖ਼نܗ • ީิΩʔͷҰ෦͔ΒඇΩʔଐੑͷؔैଐ͕ഉআ͞Εͨঢ়ଶɻ • ୯ҰଐੑͷީิΩʔ͔͠ଘࡏ͠ͳ͍߹ʹࣗಈతʹୈ2ਖ਼نܗͱ ͳΔɻ ໊ ྸ ॻ੶
ฒ ߊ σʔλϕʔε࣮ફೖ ฒ ߊ 42-Ξϯνύλʔϯ ฒ ߊ υϝΠϯۦಈઃܭ ࢁా ଠ σʔλϕʔε࣮ફೖ ໊ ྸ ฒ ߊ ࢁా ଠ ໊ ॻ੶ ฒ ߊ σʔλϕʔε࣮ફೖ ฒ ߊ 42-Ξϯνύλʔϯ ฒ ߊ υϝΠϯۦಈઃܭ ࢁా ଠ σʔλϕʔε࣮ફೖ
ୈ̏ਖ਼نܗ • ඇΩʔଐੑͷਪҠؔैଐ͕ഉআ͞Εͨঢ়ଶɻ ໊ ྸ ಓݝ ݝிॴࡏ ฒ ߊ
େ େ ࢁా ଠ ࢁޱ ࢁޱ ాத Ֆࢠ ࢁޱ ࢁޱ ࠤ౻ ౡ ౡ ໊ ྸ ಓݝ ฒ ߊ େ ࢁా ଠ ࢁޱ ాத Ֆࢠ ࢁޱ ࠤ౻ ౡ ಓݝ ݝிॴࡏ ւಓ ࡳຈ ࢁޱ ࢁޱ େ େ
ϘΠείουਖ਼نܗ • ඇΩʔଐੑ͔ΒީิΩʔʹର͢ΔؔैଐੑΛഉআͨ͠ͷɻ • ΄ͱΜͲͷ߹ʹ͓͍ͯୈ̏ਖ਼نܗͱಉ͡ʹͳΔ͕ɺީิΩʔ͕ෳ ଘࡏ͢Δ߹ʹୈ̏ਖ਼نܗͰ͋Δ͕ϘΠείουਖ਼نܗͰ ͳ͍͜ͱ͕ى͜Γ͏Δɻ ໊ ϓϩδΣΫτ
Ϛωʔδϟʔ ฒ ߊ 999 ҏ౻ ฒ ߊ ::: தଜ ࢁా ଠ 999 খྛ ࢁా ଠ ;;; ࢁຊ Ϛωʔδϟʔ ϓϩδΣΫτ ҏ౻ 999 தଜ ::: খྛ 999 ࢁຊ ;;; ໊ Ϛωʔδϟʔ ฒ ߊ ҏ౻ ฒ ߊ தଜ ࢁా ଠ খྛ ࢁా ଠ ࢁຊ
ୈ4ਖ਼نܗ • Ұ෦ͷ݁߹ैଐੑʢଟैଐੑʣΛഉআͨ͠ঢ়ଶɻ • ୈ̐ਖ਼نܗͱୈ̑ਖ਼نܗީิΩʔͷΈͰߏ͞ΕΔϦϨʔγϣϯ ͷΈ͕ਖ਼نԽͷରͱͳΔɻ ໊ ৭ αΠζ ϫϯϐʔε
ന 4 ϫϯϐʔε ന . ϫϯϐʔε ϐϯΫ 4 ϫϯϐʔε ϐϯΫ . εΧʔτ ࠇ 4 εΧʔτ ࠇ . εΧʔτ ࠇ - εΧʔτ ന 4 εΧʔτ ന . εΧʔτ ന - ࢠ ੨ . ໊ αΠζ ϫϯϐʔε 4 ϫϯϐʔε . εΧʔτ 4 εΧʔτ . εΧʔτ - ࢠ . ໊ ৭ ϫϯϐʔε ന ϫϯϐʔε ϐϯΫ εΧʔτ ࠇ εΧʔτ ന ࢠ ੨
ୈ5ਖ਼نܗ • ͯ͢ͷ݁߹ैଐੑΛഉআͨ͠ঢ়ଶɻ • ࣄ্࣮ɺਖ਼نܗͷ࠷ऴஈ֊Ͱ͋Δɻ • ୈ̒ਖ਼نܗଘࡏ͢Δ͕࣮ࡍʹ͋·Γҙຯ͕ͳ͍ɻ
ୈ4ਖ਼نܗ / ୈ5ਖ਼نܗ • ݁߹ैଐੑΛഉআͨ͠ঢ়ଶɻ • ީิΩʔͷΈͰߏ͞ΕΔϦϨʔγϣϯͷ߹ʹ͜ΕΒͷਖ਼نԽ Λͨ͠΄͏͕Α͍߹͋Δɻ
ਖ਼نԽ͠ͳ͍ͱ͍͏બࢶ • ͦͦϦϨʔγϣφϧσʔλϞσϧͱ૬ੑ͕ѱ͍σʔλͷ߹ඞ ͣ͠ਖ਼نԽΛ͢Δඞཁͳ͍ɻ • ߹ʹΑͬͯͦͦҧ͏ΞʔΩςΫνϟΛݕ౼ͨ͠΄͏͕Α͍ɻ • ཤྺσʔλ • ߏσʔλ
• άϥϑσʔλ • ෳࡶͳॱং͖Ϧετ
PostgreSQL ʹ͓͚Δ࣮
ϦϨʔγϣφϧσʔλϞσϧʹͳ͍͕SQLʹ͋Δͷ • NULL • ॱংɾฒͼସ͑ • τϥϯβΫγϣϯ • ΠϯσοΫε
PostgreSQL ͷ࣮ • JOIN • ΠϯσοΫε • τϥϯβΫγϣϯ
݁߹ͷ࣮ • ωεςουϧʔϓ݁߹ • Ϛʔδ݁߹ • ϋογϡ݁߹
ωεςουϧʔϓ݁߹
Ϛʔδ݁߹
ϋογϡ݁߹
ΠϯσοΫε ͷ࣮ • B-Tree ΠϯσοΫε • B-Tree ߏΛ࣋ͭ൚༻తʹ༻͍ΒΕΔΠϯσοΫεɻ • ϋογϡΠϯσοΫε
• ΠϯσοΫεΛϋογϡςʔϒϧͰอ࣋͢Δɻ • ݱࡏඇਪɻ • GIN ΠϯσοΫε • શจݕࡧ༻్ʹ༻͍ΔΠϯσοΫεɻ • GiST ΠϯσοΫε • ۭؒใ͚ͷΠϯσοΫεɻ
B-Tree ͷߏ
τϥϯβΫγϣϯ • ϦϨʔγϣφϧσʔλϞσϧͱਖ਼نԽཧσʔλͷ߹ੑΛอͭ ͨΊʹ༗ޮͰ͋Δ͕ɺෳͷؔԋࢉΛΞτϛοΫʹ࣮ࢪ͠ͳ͍ͱ σʔλ߹ੑ͕յΕΔέʔεͰτϥϯβΫγϣϯͷ֓೦͕ඞਢʹ ͳΔɻ • τϥϯβΫγϣϯϦϨʔγϣφϧσʔλϞσϧʹ͓͚Δ֓೦Ͱ ͳ͍͕ RDB
ʹඞਢͷΈͰ͋Δɻ
τϥϯβΫγϣϯϨϕϧ • Read Uncommitted • τϥϯβΫγϣϯϨϕϧ͕࠷͘ɺμʔςΟϦʔυʢଞͷτϥϯβΫγϣϯ ͕ॻ͖ࠐΜͰ·ͩίϛοτ͍ͯ͠ͳ͍σʔλΛಡΉʣ͕ൃੜ͢ΔՄೳੑ͕͋Δɻ • Read Committed
• ଞͷτϥϯβΫγϣϯ͕ίϛοτͨ͠σʔλΛࢀর͢Δ͕෮ಡΈࠐΈͷՄೳੑ ͋Δɻ • Repeatable Read • ಉҰτϥϯβΫγϣϯͰԿಉ͡σʔλΛࢀরͯ͠༰มΘΒͣɺ෮ಡΈ औΓʹରͯ҆͠શʹͳΔɻ • Serializable • τϥϯβΫγϣϯ͕ྻʹฒͼଞͷͯ͢ͷτϥϯβΫγϣϯ͔Β͞ΕΔɻ
·ͱΊ • RDB Λ͏ͨΊʹϦϨʔγϣφϧσʔλϞσϧΛ͖ͪΜͱཧղ͢ Δඞཁ͕͋Δɻ • ϦϨʔγϣφϧσʔλϞσϧͷݶքΛΓɺϦϨʔγϣφϧσʔ λϞσϧ͕ۤखͱ͢Δ෦ผͷΞʔΩςΫνϟͰઃܭΛ͢Δɻ • RDB
͕࣮ࡍʹͲͷΑ͏ʹ࣮͞Ε͍ͯΔ͔Λཧղ͠ɺదʹઃܭΛ ͢Δɻ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠