Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
PostgreSQLで学ぶリレーショナルデータモデルとその実装
Search
Akira Suenami
May 01, 2016
Technology
1
1k
PostgreSQLで学ぶリレーショナルデータモデルとその実装
中国DB勉強会でのトーク資料です。
Akira Suenami
May 01, 2016
Tweet
Share
More Decks by Akira Suenami
See All by Akira Suenami
可変性を制する設計: 構造と振る舞いから考える概念モデリングとその実装
a_suenami
9
2.2k
オブジェクト指向考古学 〜人類は再びDCIの夢を見るか〜
a_suenami
5
3.3k
トランザクションスクリプトはどこから来たのか トランザクションスクリプトは何者か トランザクションスクリプトはどこへ行くのか #sekkeinight
a_suenami
14
6.8k
値と属性の話
a_suenami
0
280
ドメインモデラーにとって受託開発であることは制約なのか?
a_suenami
1
1.5k
異なるモデリングパラダイムから見るモデリングの勘所 #ooc_2020
a_suenami
2
3.2k
マルチパラダイムモデリング 〜異なるモデリングパラダイムから見るモデリングの勘所〜 #PHPerKaigi
a_suenami
0
3.9k
“ユーザーファースト”の功罪 〜分析と実験によるアーキテクチャ設計〜 #bpstudy
a_suenami
4
1.4k
ドメインモデルのつくり方 #5000dai
a_suenami
16
4.9k
Other Decks in Technology
See All in Technology
評価駆動開発で不確実性を制御する - MLflow 3が支えるエージェント開発
databricksjapan
1
200
[JAWS-UG 横浜支部 #91]DevOps Agent vs CloudWatch Investigations -比較と実践-
sh_fk2
2
260
5分で知るMicrosoft Ignite
taiponrock
PRO
0
380
初めてのDatabricks AI/BI Genie
taka_aki
0
180
re:Invent2025 3つの Frontier Agents を紹介 / introducing-3-frontier-agents
tomoki10
0
150
「Managed Instances」と「durable functions」で広がるAWS Lambdaのユースケース
lamaglama39
0
320
AWSを使う上で最低限知っておきたいセキュリティ研修を社内で実施した話 ~みんなでやるセキュリティ~
maimyyym
2
1.5k
ExpoのインダストリーブースでみたAWSが見せる製造業の未来
hamadakoji
0
110
大企業でもできる!ボトムアップで拡大させるプラットフォームの作り方
findy_eventslides
1
790
生成AI活用の型ハンズオン〜顧客課題起点で設計する7つのステップ
yushin_n
0
200
打 造 A I 驅 動 的 G i t H u b ⾃ 動 化 ⼯ 作 流 程
appleboy
0
350
[CMU-DB-2025FALL] Apache Fluss - A Streaming Storage for Real-Time Lakehouse
jark
0
120
Featured
See All Featured
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
The Invisible Side of Design
smashingmag
302
51k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
286
14k
It's Worth the Effort
3n
187
29k
What's in a price? How to price your products and services
michaelherold
246
13k
BBQ
matthewcrist
89
9.9k
Speed Design
sergeychernyshev
33
1.4k
Unsuck your backbone
ammeep
671
58k
Bash Introduction
62gerente
615
210k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Building an army of robots
kneath
306
46k
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
͕࣮ࡍʹͲͷΑ͏ʹ࣮͞Ε͍ͯΔ͔Λཧղ͠ɺదʹઃܭΛ ͢Δɻ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠