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
960
PostgreSQLで学ぶリレーショナルデータモデルとその実装
中国DB勉強会でのトーク資料です。
Akira Suenami
May 01, 2016
Tweet
Share
More Decks by Akira Suenami
See All by Akira Suenami
オブジェクト指向考古学 〜人類は再びDCIの夢を見るか〜
a_suenami
5
2.8k
トランザクションスクリプトはどこから来たのか トランザクションスクリプトは何者か トランザクションスクリプトはどこへ行くのか #sekkeinight
a_suenami
14
6.3k
値と属性の話
a_suenami
0
230
ドメインモデラーにとって受託開発であることは制約なのか?
a_suenami
1
1.4k
異なるモデリングパラダイムから見るモデリングの勘所 #ooc_2020
a_suenami
2
3.1k
マルチパラダイムモデリング 〜異なるモデリングパラダイムから見るモデリングの勘所〜 #PHPerKaigi
a_suenami
0
3.9k
“ユーザーファースト”の功罪 〜分析と実験によるアーキテクチャ設計〜 #bpstudy
a_suenami
4
1.4k
ドメインモデルのつくり方 #5000dai
a_suenami
16
4.9k
ビジネスの構造を扱うアーキテクチャとユーザとの接点を扱うアーキテクチャ #builderscon
a_suenami
46
12k
Other Decks in Technology
See All in Technology
BigQuery Remote FunctionでLooker Studioをインタラクティブ化
cuebic9bic
2
200
kubellが挑むBPaaSにおける、人とAIエージェントによるサービス開発の最前線と技術展望
kubell_hr
1
390
Definition of Done
kawaguti
PRO
6
440
新規プロダクト開発、AIでどう変わった? #デザインエンジニアMeetup
bengo4com
0
490
Amazon S3標準/ S3 Tables/S3 Express One Zoneを使ったログ分析
shigeruoda
1
300
AIのAIによるAIのための出力評価と改善
chocoyama
0
420
25分で解説する「最小権限の原則」を実現するための AWS「ポリシー」大全
opelab
8
2k
OAuth/OpenID Connectで実現するMCPのセキュアなアクセス管理
kuralab
5
710
データプラットフォーム技術におけるメダリオンアーキテクチャという考え方/DataPlatformWithMedallionArchitecture
smdmts
4
500
Azure AI Foundryでマルチエージェントワークフロー
seosoft
0
140
_第3回__AIxIoTビジネス共創ラボ紹介資料_20250617.pdf
iotcomjpadmin
0
140
活きてなかったデータを活かしてみた話 / Shirokane Kougyou vol 19
sansan_randd
1
400
Featured
See All Featured
Typedesign – Prime Four
hannesfritz
42
2.7k
Optimising Largest Contentful Paint
csswizardry
37
3.3k
Stop Working from a Prison Cell
hatefulcrawdad
269
20k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
32
5.9k
Java REST API Framework Comparison - PWX 2021
mraible
31
8.6k
The Cult of Friendly URLs
andyhume
79
6.4k
How STYLIGHT went responsive
nonsquared
100
5.6k
Building Adaptive Systems
keathley
43
2.6k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
252
21k
Code Review Best Practice
trishagee
68
18k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
20
1.3k
Rails Girls Zürich Keynote
gr2m
94
14k
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
͕࣮ࡍʹͲͷΑ͏ʹ࣮͞Ε͍ͯΔ͔Λཧղ͠ɺదʹઃܭΛ ͢Δɻ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠