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
940
PostgreSQLで学ぶリレーショナルデータモデルとその実装
中国DB勉強会でのトーク資料です。
Akira Suenami
May 01, 2016
Tweet
Share
More Decks by Akira Suenami
See All by Akira Suenami
オブジェクト指向考古学 〜人類は再びDCIの夢を見るか〜
a_suenami
5
2.3k
トランザクションスクリプトはどこから来たのか トランザクションスクリプトは何者か トランザクションスクリプトはどこへ行くのか #sekkeinight
a_suenami
14
6.1k
値と属性の話
a_suenami
0
210
ドメインモデラーにとって受託開発であることは制約なのか?
a_suenami
1
1.4k
異なるモデリングパラダイムから見るモデリングの勘所 #ooc_2020
a_suenami
2
3k
マルチパラダイムモデリング 〜異なるモデリングパラダイムから見るモデリングの勘所〜 #PHPerKaigi
a_suenami
0
3.8k
“ユーザーファースト”の功罪 〜分析と実験によるアーキテクチャ設計〜 #bpstudy
a_suenami
4
1.3k
ドメインモデルのつくり方 #5000dai
a_suenami
16
4.8k
ビジネスの構造を扱うアーキテクチャとユーザとの接点を扱うアーキテクチャ #builderscon
a_suenami
46
11k
Other Decks in Technology
See All in Technology
GitHub MCP Serverを使って Pull Requestを作る、レビューする
hiyokose
2
490
Tirez profit de Messenger pour améliorer votre architecture
tucksaun
1
180
スケールアップ企業のQA組織のバリューを最大限に引き出すための取り組み
tarappo
4
1.1k
ウェブアクセシビリティとは
lycorptech_jp
PRO
0
340
React Server Componentは 何を解決し何を解決しないのか / What do React Server Components solve, and what do they not solve?
kaminashi
6
1.3k
ペアーズにおけるData Catalog導入の取り組み
hisamouna
0
240
AIエージェント開発における「攻めの品質改善」と「守りの品質保証」 / 2024.04.09 GPU UNITE 新年会 2025
smiyawaki0820
0
130
AWS CDK コントリビュート はじめの一歩
yendoooo
1
130
LINEギフトのLINEミニアプリアクセシビリティ改善事例
lycorptech_jp
PRO
0
320
FinOps_Demo
tkhresk
0
110
Enterprise AI in 2025?
pamelafox
0
120
ソフトウェアプロジェクトの成功率が上がらない原因-「社会価値を考える」ということ-
ytanaka5569
0
140
Featured
See All Featured
Music & Morning Musume
bryan
46
6.4k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
46
2.4k
A Tale of Four Properties
chriscoyier
158
23k
Making the Leap to Tech Lead
cromwellryan
133
9.2k
Speed Design
sergeychernyshev
28
870
The Power of CSS Pseudo Elements
geoffreycrofte
75
5.7k
Statistics for Hackers
jakevdp
798
220k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
40
2.1k
Fireside Chat
paigeccino
37
3.4k
Mobile First: as difficult as doing things right
swwweet
223
9.5k
Rebuilding a faster, lazier Slack
samanthasiow
80
8.9k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
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
͕࣮ࡍʹͲͷΑ͏ʹ࣮͞Ε͍ͯΔ͔Λཧղ͠ɺదʹઃܭΛ ͢Δɻ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠