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
920
PostgreSQLで学ぶリレーショナルデータモデルとその実装
中国DB勉強会でのトーク資料です。
Akira Suenami
May 01, 2016
Tweet
Share
More Decks by Akira Suenami
See All by Akira Suenami
オブジェクト指向考古学 〜人類は再びDCIの夢を見るか〜
a_suenami
5
2.2k
トランザクションスクリプトはどこから来たのか トランザクションスクリプトは何者か トランザクションスクリプトはどこへ行くのか #sekkeinight
a_suenami
14
6k
値と属性の話
a_suenami
0
200
ドメインモデラーにとって受託開発であることは制約なのか?
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
Iceberg Meetup Japan #1 : Iceberg and Databricks
databricksjapan
0
380
Ruby on Railsで持続可能な開発を行うために取り組んでいること
am1157154
3
160
AWSアカウントのセキュリティ自動化、どこまで進める? 最適な設計と実践ポイント
yuobayashi
7
640
遷移の高速化 ヤフートップの試行錯誤
narirou
6
1.2k
1行のコードから社会課題の解決へ: EMの探究、事業・技術・組織を紡ぐ実践知 / EM Conf 2025
9ma3r
11
3.9k
AIエージェント開発のノウハウと課題
pharma_x_tech
0
350
生成AI×財務経理:PoCで挑むSlack AI Bot開発と現場巻き込みのリアル
pohdccoe
1
740
PHPで印刷所に入稿できる名札データを作る / Generating Print-Ready Name Tag Data with PHP
tomzoh
0
190
LINE NEWSにおけるバックエンド開発
lycorptech_jp
PRO
0
270
30→150人のエンジニア組織拡大に伴うアジャイル文化を醸成する役割と取り組みの変化
nagata03
0
180
脳波を用いた嗜好マッチングシステム
hokkey621
0
290
AWS Well-Architected Frameworkで学ぶAmazon ECSのセキュリティ対策
umekou
2
150
Featured
See All Featured
RailsConf 2023
tenderlove
29
1k
BBQ
matthewcrist
87
9.5k
A better future with KSS
kneath
238
17k
Rails Girls Zürich Keynote
gr2m
94
13k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
Why Our Code Smells
bkeepers
PRO
336
57k
Testing 201, or: Great Expectations
jmmastey
42
7.2k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.2k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
32
2.1k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Building Flexible Design Systems
yeseniaperezcruz
328
38k
YesSQL, Process and Tooling at Scale
rocio
172
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
͕࣮ࡍʹͲͷΑ͏ʹ࣮͞Ε͍ͯΔ͔Λཧղ͠ɺదʹઃܭΛ ͢Δɻ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠