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
RDBおける候補キーを求めるためのアルゴリズム
Search
kubo ayumu
August 27, 2022
Programming
0
1.1k
RDBおける候補キーを求めるためのアルゴリズム
https://fortee.jp/phpcon-okinawa-2022/proposal/2674b12d-0aea-4d1e-9ad2-3d1338d2d0d4
kubo ayumu
August 27, 2022
Tweet
Share
More Decks by kubo ayumu
See All by kubo ayumu
caching_sha2_passwordのはなし
boro1234
0
470
大テーブルと小テーブルのJOINのコスト計算の話
boro1234
5
2k
やさしいActiveRecordのDB接続のしくみ
boro1234
14
8k
テーブル定義変更の ガイドラインを作った話
boro1234
2
1.5k
正規化理論ことはじめ -数学的背景から理解する正規化の初手-
boro1234
1
940
CakePHPの内部実装 から理解するPSR-7
boro1234
0
1.4k
Other Decks in Programming
See All in Programming
今だからこそ入門する Server-Sent Events (SSE)
nearme_tech
PRO
2
130
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
350
Processing Gem ベースの、2D レトロゲームエンジンの開発
tokujiros
2
120
AI Coding Agentのセキュリティリスク:PRの自己承認とメルカリの対策
s3h
0
200
アセットのコンパイルについて
ojun9
0
120
How Android Uses Data Structures Behind The Scenes
l2hyunwoo
0
420
Tool Catalog Agent for Bedrock AgentCore Gateway
licux
6
2.4k
Introducing ReActionView: A new ActionView-compatible ERB Engine @ Rails World 2025, Amsterdam
marcoroth
0
670
AIと私たちの学習の変化を考える - Claude Codeの学習モードを例に
azukiazusa1
10
3.8k
Ruby Parser progress report 2025
yui_knk
1
440
プロポーザル駆動学習 / Proposal-Driven Learning
mackey0225
2
1.3k
Vue・React マルチプロダクト開発を支える Vite
andpad
0
110
Featured
See All Featured
Making Projects Easy
brettharned
117
6.4k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
53
2.9k
The Power of CSS Pseudo Elements
geoffreycrofte
77
6k
The Cult of Friendly URLs
andyhume
79
6.6k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.9k
What's in a price? How to price your products and services
michaelherold
246
12k
Being A Developer After 40
akosma
90
590k
Optimising Largest Contentful Paint
csswizardry
37
3.4k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
36
2.5k
We Have a Design System, Now What?
morganepeng
53
7.8k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
15
1.6k
The Art of Programming - Codeland 2020
erikaheidi
56
13k
Transcript
RDBにおける候補キーを 求めるためのアルゴリズム
© 2022 for LANCERS, Inc. All Rights Reserved 2 2
久保 路(くぼ あゆむ) ・ 2020.04 ~ 2021.12 BIチームに所属しSalesforce管理・開発 ・ 2022.01~ 現在 QAチームに所属しCakePHP2→4への バージョンアッププロジェクトに参画中 ・クエリチューニングをきっかけに RDBの勉強にハマる ・クラフトビールが好き
© 2022 for LANCERS, Inc. All Rights Reserved 3 3
今日持ち帰っていただきたいこと ・候補キーとは一体何か ・候補キーを見つけることはなぜ重要なのか ・候補キーを求めるためのアルゴリズムはどのようなものか ・なんか面白そうという気持ち
© 2022 for LANCERS, Inc. All Rights Reserved 4 4
1 RDBにおける用語の整理 2 候補キーを求めるためのアルゴリズム 3 アルゴリズムの例 4 最後に アジェンダ
RDBにおける用語の整理
© 2022 for LANCERS, Inc. All Rights Reserved 6 •
いくつかの集合の組み合わせ(の部分集合)を指す • 例 名前の集合 D_1 = {太郎,花子,二郎}, 年齢の集合 D_2 = {20,25} の組み合わせから R = { (太郎,20), (花子,25), (二郎,20) }のようなリレーションができる • リレーションは表として実現することができる リレーションとは
© 2022 for LANCERS, Inc. All Rights Reserved 7 •
例 ◦ D_1 = {太郎,花子,二郎}, D_2 = {20,25} の組み合わせから R = { (太郎,20), (花子,25), (二郎,20) }のようなリレーションができる リレーションとは 名前 年齢 太郎 20 花子 25 二郎 20
© 2022 for LANCERS, Inc. All Rights Reserved 8 •
例 ◦ D_1 = {太郎,花子,二郎}, D_2 = {20,25} の組み合わせから R = { (太郎,20), (花子,25), (二郎,20) }のようなリレーションができる リレーションとは 名前 年齢 太郎 20 花子 25 二郎 20 列 / カラム
© 2022 for LANCERS, Inc. All Rights Reserved 9 •
例 ◦ D_1 = {太郎,花子,二郎}, D_2 = {20,25} の組み合わせから R = { (太郎,20), (花子,25), (二郎,20) }のようなリレーションができる リレーションとは 名前 年齢 太郎 20 花子 25 二郎 20 行 / タプル
© 2022 for LANCERS, Inc. All Rights Reserved 10 •
例 ◦ D_1 = {太郎,花子,二郎}, D_2 = {20,25} の組み合わせから R = { (太郎,20), (花子,25), (二郎,20) }のようなリレーションができる リレーションとは 名前 年齢 太郎 20 花子 25 二郎 20 属性名
© 2022 for LANCERS, Inc. All Rights Reserved 11 •
リレーションの属性名の集合Kが候補キーであるとは次を満たすこと ◦ リレーションの任意の行 t と sに対して tのKの値とsのKの値が一致すれば、tとsは完全一致する ◦ Kの自身を除く部分集合に対しては、上記は成り立たない 候補キーとは
© 2022 for LANCERS, Inc. All Rights Reserved 12 •
リレーションの属性名の集合Kが候補キーであるとは次を満たすこと ◦ リレーションの任意の行 t と sに対して tのKの値とsのKの値が一致すれば、tとsは完全一致する → Kの値さえ決まれば、行が一意に定まる ◦ Kの自身を除く部分集合に対しては、上記は成り立たない → Kを分解してしまうと、行を一意に識別できなくなってしまう 候補キーとは
© 2022 for LANCERS, Inc. All Rights Reserved 13 「日本人」というリレーション
を考えてみよう
© 2022 for LANCERS, Inc. All Rights Reserved 14
© 2022 for LANCERS, Inc. All Rights Reserved 15 1人の人間に対し、色んな情報が存在する
© 2022 for LANCERS, Inc. All Rights Reserved 16 姓名
年齢 生年月日 住所 個人番号 星座 性別 郵便番号
© 2022 for LANCERS, Inc. All Rights Reserved 17 個人番号
姓名 年齢 住所 生年月日 性別 郵便番号 星座 00001 山田太郎 26 東京都 墨田区 押上1丁目 1−2 1996/01/01 男 1310045 山羊座 00002 田中花子 22 東京都 港区 芝公園4丁目 2−8 2000/01/01 女 1050011 山羊座 各ドメインを組み合わせてリレーション「日本人」が作れる
© 2022 for LANCERS, Inc. All Rights Reserved 18 行(1人の人間)を一意に特定できる属性はどれでしょうか?
© 2022 for LANCERS, Inc. All Rights Reserved 19 姓名
年齢 生年月日 住所 個人番号 星座 性別 郵便番号
© 2022 for LANCERS, Inc. All Rights Reserved 20 姓名
年齢 生年月日 住所 個人番号 性別 星座 郵便番号
© 2022 for LANCERS, Inc. All Rights Reserved 21 姓名
年齢 生年月日 住所 個人番号 性別 行を特定できる =候補キー
© 2022 for LANCERS, Inc. All Rights Reserved 22 ちなみに
© 2022 for LANCERS, Inc. All Rights Reserved 23 姓名
年齢 生年月日 住所 個人番号 星座 性別 郵便番号
© 2022 for LANCERS, Inc. All Rights Reserved 24 姓名
年齢 住所 星座 性別 郵便番号 郵便番号を特定するのは 住所だけで十分
© 2022 for LANCERS, Inc. All Rights Reserved 25 姓名
年齢 住所 星座 性別 郵便番号 郵便番号を特定するのは 住所だけで十分 →郵便番号はこのリレーション でわざわざ持つ必要がない
© 2022 for LANCERS, Inc. All Rights Reserved 26 姓名
年齢 住所 星座 性別 郵便番号 郵便番号を特定するのは 住所だけで十分 →郵便番号はこのリレーション でわざわざ持つ必要がない →別のリレーションに 情報を持たせる(正規化)
© 2022 for LANCERS, Inc. All Rights Reserved 27 •
候補キーは行を一意に特定するキー • 正規化する上で候補キーを主軸に考慮する必要がある • そのため、候補キーが何であるかを特定することは重要
候補キーを求めるための アルゴリズム
© 2022 for LANCERS, Inc. All Rights Reserved 29 •
リレーションの属性名の集合A,Bに対して関数従属性A→Bが存在すると は次を満たすことをいう ◦ リレーションの任意の行 t と sに対して tのAの値とsのAの値が一致すれば、 tのBの値とsのBの値が一致する 関数従属性とは
© 2022 for LANCERS, Inc. All Rights Reserved 30 •
リレーションの属性名の集合A,Bに対して関数従属性A→Bが存在すると は次を満たすことをいう ◦ リレーションの任意の行 t と sに対して tのAの値とsのAの値が一致すれば、 tのBの値とsのBの値が一致する → Aの値が決まれば、Bの値が一意に定まる 関数従属性とは
© 2022 for LANCERS, Inc. All Rights Reserved 31 姓名
年齢 生年月日 住所 個人番号 星座 性別 郵便番号
© 2022 for LANCERS, Inc. All Rights Reserved 32 姓名
年齢 生年月日 住所 個人番号 星座 性別 郵便番号
© 2022 for LANCERS, Inc. All Rights Reserved 33 姓名
年齢 生年月日 住所 個人番号 星座 性別 郵便番号
© 2022 for LANCERS, Inc. All Rights Reserved 34 •
リレーションの属性名の集合Xの閉包X+とは次のような集合である ◦ Xが決定項となる全ての関数従属性の 被決定項からなる属性名の集合 属性集合の閉包とは
© 2022 for LANCERS, Inc. All Rights Reserved 35 •
リレーションの属性名の集合Xの閉包X+とは次のような集合である ◦ Xが決定項となる全ての関数従属性の 被決定項からなる属性名の集合 → Xを決めれば一意に定まる全ての属性名の集合 属性集合の閉包とは
© 2022 for LANCERS, Inc. All Rights Reserved 36 姓名
年齢 生年月日 住所 個人番号 星座 性別 郵便番号 X
© 2022 for LANCERS, Inc. All Rights Reserved 37 姓名
年齢 生年月日 住所 個人番号 星座 性別 郵便番号 X+
© 2022 for LANCERS, Inc. All Rights Reserved 38 姓名
年齢 生年月日 住所 個人番号 星座 性別 郵便番号 X
© 2022 for LANCERS, Inc. All Rights Reserved 39 姓名
年齢 生年月日 住所 個人番号 星座 性別 郵便番号 X+
© 2022 for LANCERS, Inc. All Rights Reserved 40 ここで候補キーを閉包を使った
書き方に直してみる
© 2022 for LANCERS, Inc. All Rights Reserved 41 •
リレーションの属性名の集合Kが候補キーであるとは次を満たすこと ◦ K+ が全ての属性の集合と一致する → Kの値さえ決まれば、行が一意に定まる ◦ Kの自身を除く部分集合に対しては、上記は成り立たない → Kを分解してしまうと、行を一意に識別できなくなってしまう 候補キーとは (閉包を用いた言い方)
© 2022 for LANCERS, Inc. All Rights Reserved 42 お待たせしました
アルゴリズムを紹介します
© 2022 for LANCERS, Inc. All Rights Reserved 43 1.
K を 属性全体の集合 とおく 2. Kの各属性Aに対して以下を実行する {K - A}+が属性全体の集合となればK を K - A で置き換える そうでなければ、Kをそのままとする 3. 最終的に残ったKが候補キーとなる 候補キーを1つ求めるためのアルゴリズム
アルゴリズムの例
© 2022 for LANCERS, Inc. All Rights Reserved 45 姓名
年齢 生年月日 住所 個人番号 星座 性別 郵便番号
© 2022 for LANCERS, Inc. All Rights Reserved 46 •
住所が分かれば、郵便番号が分かる • 生年月日が分かれば、年齢・星座が分かる • 姓名・住所が分かれば、個人番号が分かる • 個人番号が分かれば、生年月日・性別・姓名・住所が分かる 以下を既知として、候補キーを見つける
© 2022 for LANCERS, Inc. All Rights Reserved 47 1.
K を 属性全体の集合 とおく 2. Kの各属性Aに対して以下を実行する {K - A}+が属性全体の集合となればK を K - A で置き換える そうでなければ、Kをそのままとする 3. 最終的に残ったKが候補キーとなる 候補キーを1つ求めるためのアルゴリズム(再掲)
© 2022 for LANCERS, Inc. All Rights Reserved 48 姓名
年齢 生年月日 住所 個人番号 星座 性別 郵便番号 K
© 2022 for LANCERS, Inc. All Rights Reserved 49 1.
K を 属性全体の集合 とおく 2. Kの各属性Aに対して以下を実行する {K - A}+が属性全体の集合となればK を K - A で置き換える そうでなければ、Kをそのままとする 3. 最終的に残ったKが候補キーとなる 候補キーを1つ求めるためのアルゴリズム(再掲)
© 2022 for LANCERS, Inc. All Rights Reserved 50 姓名
年齢 生年月日 住所 個人番号 星座 性別 郵便番号 A
© 2022 for LANCERS, Inc. All Rights Reserved 51 姓名
年齢 生年月日 住所 個人番号 星座 性別 郵便番号 K-A
© 2022 for LANCERS, Inc. All Rights Reserved 52 姓名
年齢 生年月日 住所 個人番号 星座 性別 郵便番号 {K-A}+
© 2022 for LANCERS, Inc. All Rights Reserved 53 {K-A}+が全属性集合になる!
© 2022 for LANCERS, Inc. All Rights Reserved 54 1.
K を 属性全体の集合 とおく 2. Kの各属性Aに対して以下を実行する {K - A}+が属性全体の集合となればK を K - A で置き換える そうでなければ、Kをそのままとする 3. 最終的に残ったKが候補キーとなる 候補キーを1つ求めるためのアルゴリズム(再掲)
© 2022 for LANCERS, Inc. All Rights Reserved 55 姓名
年齢 生年月日 住所 個人番号 星座 性別 郵便番号 K:=K-A
© 2022 for LANCERS, Inc. All Rights Reserved 56 姓名
年齢 生年月日 住所 個人番号 星座 性別 郵便番号 A
© 2022 for LANCERS, Inc. All Rights Reserved 57 姓名
年齢 生年月日 住所 個人番号 星座 性別 郵便番号 K-A
© 2022 for LANCERS, Inc. All Rights Reserved 58 姓名
年齢 生年月日 住所 個人番号 星座 性別 郵便番号 {K-A}+
© 2022 for LANCERS, Inc. All Rights Reserved 59 {K-A}+が全属性集合になる!
© 2022 for LANCERS, Inc. All Rights Reserved 60 1.
K を 属性全体の集合 とおく 2. Kの各属性Aに対して以下を実行する {K - A}+が属性全体の集合となればK を K - A で置き換える そうでなければ、Kをそのままとする 3. 最終的に残ったKが候補キーとなる 候補キーを1つ求めるためのアルゴリズム(再掲)
© 2022 for LANCERS, Inc. All Rights Reserved 61 姓名
年齢 生年月日 住所 個人番号 星座 性別 郵便番号 K:=K-A
© 2022 for LANCERS, Inc. All Rights Reserved 62 繰り返し.....
© 2022 for LANCERS, Inc. All Rights Reserved 63 姓名
年齢 生年月日 住所 個人番号 星座 性別 郵便番号 K
© 2022 for LANCERS, Inc. All Rights Reserved 64 姓名
年齢 生年月日 住所 個人番号 星座 性別 郵便番号 A
© 2022 for LANCERS, Inc. All Rights Reserved 65 姓名
年齢 生年月日 住所 個人番号 星座 性別 郵便番号 K-A
© 2022 for LANCERS, Inc. All Rights Reserved 66 姓名
年齢 生年月日 住所 個人番号 星座 性別 郵便番号 {K-A}+
© 2022 for LANCERS, Inc. All Rights Reserved 67 {K-A}+が全属性集合にならない!
© 2022 for LANCERS, Inc. All Rights Reserved 68 1.
K を 属性全体の集合 とおく 2. Kの各属性Aに対して以下を実行する {K - A}+が属性全体の集合となればK を K - A で置き換える そうでなければ、Kをそのままとする 3. 最終的に残ったKが候補キーとなる 候補キーを1つ求めるためのアルゴリズム(再掲)
© 2022 for LANCERS, Inc. All Rights Reserved 69 姓名
年齢 生年月日 住所 個人番号 星座 性別 郵便番号 K
© 2022 for LANCERS, Inc. All Rights Reserved 70 姓名
年齢 生年月日 住所 個人番号 星座 性別 郵便番号 A
© 2022 for LANCERS, Inc. All Rights Reserved 71 姓名
年齢 生年月日 住所 個人番号 星座 性別 郵便番号 K-A
© 2022 for LANCERS, Inc. All Rights Reserved 72 姓名
年齢 生年月日 住所 個人番号 星座 性別 郵便番号 {K-A}+
© 2022 for LANCERS, Inc. All Rights Reserved 73 {K-A}+が全属性集合にならない!
© 2022 for LANCERS, Inc. All Rights Reserved 74 1.
K を 属性全体の集合 とおく 2. Kの各属性Aに対して以下を実行する {K - A}+が属性全体の集合となればK を K - A で置き換える そうでなければ、Kをそのままとする 3. 最終的に残ったKが候補キーとなる 候補キーを1つ求めるためのアルゴリズム(再掲)
© 2022 for LANCERS, Inc. All Rights Reserved 75 姓名
年齢 生年月日 住所 個人番号 星座 性別 郵便番号 K
© 2022 for LANCERS, Inc. All Rights Reserved 76 1.
K を 属性全体の集合 とおく 2. Kの各属性Aに対して以下を実行する {K - A}+が属性全体の集合となればK を K - A で置き換える そうでなければ、Kをそのままとする 3. 最終的に残ったKが候補キーとなる 候補キーを1つ求めるためのアルゴリズム(再掲)
© 2022 for LANCERS, Inc. All Rights Reserved 77 姓名
年齢 生年月日 住所 個人番号 星座 性別 郵便番号 候補キー!
© 2022 for LANCERS, Inc. All Rights Reserved 78 •
属性の選び方によって見つかる候補キーは異なる • 属性の数をN、関数従属性の数をPとすると、 閉包を求める計算はN×Pのオーダーの時間計算量となる • 候補キーの計算は結局、各属性に対して閉包を求めることになる ので、(N^2)×Pのオーダーの時間計算量となる
最後に
© 2022 for LANCERS, Inc. All Rights Reserved 80 80
今日持ち帰っていただきたいこと ・候補キーとは一体何か →行を一意に特定する極小のキー ・候補キーを見つけることはなぜ重要なのか →正規化において主軸となる要素のため ・候補キーを求めるためのアルゴリズムはどのようなものか →全属性集合から各属性を順に取り除いて閉包を計算し それが全属性集合と一致するかを判定する ・なんか面白そうという気持ち→どうでしたか
© 2022 for LANCERS, Inc. All Rights Reserved 81 81
参考文献 ・増永 良文. リレーショナルデータベース入門[第3版] . サイエンス 社, 2017 ・R. Elmasri and S. B. Navathe. Fundamentals of Database Systems. Addison-Wesley, 2000 ・C. Lucchesi and S. Osborn. Candidate keys for relations, Journal of Computer and System Sciences. 1978
© 2022 for LANCERS, Inc. All Rights Reserved 82 ありがとうございました!
© 2022 for LANCERS, Inc. All Rights Reserved 83 1.
X^0 = Xとおく 2. X^i = X^(i-1) U {X^(i-1)の要素が決定項となる全ての関数従属性の 被決定項からなる属性名の集合} 3. X^i = X^(i-1)ならX^(i-1)がXの閉包。 そうでなければ添字iの値を1つ足して、2を再度評価 閉包X+を求めるためのアルゴリズム
© 2022 for LANCERS, Inc. All Rights Reserved 84 •
リレーショナルデータベースの略 • リレーショナルデータモデルに基づいて実装されたDB それを管理するシステムがRDBMS • 例 ◦ MySQL ◦ SQL Server ◦ Oracle ◦ etc.. RDBとは
© 2022 for LANCERS, Inc. All Rights Reserved 85 •
集合(重複のない要素の集まり)を指す • 例 ◦ 人名の集合 D_name = {太郎,花子,二郎,....} ◦ 自然数の集合 D_natural = {1,2,3,4,5,...} ◦ 都道府県の集合 D_pref = {北海道,青森県,...} ◦ etc.. ドメインとは
© 2022 for LANCERS, Inc. All Rights Reserved 86 姓名
年齢 生年月日 住所 個人番号 星座 性別 郵便番号