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
940
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
大テーブルと小テーブルのJOINのコスト計算の話
boro1234
5
1.9k
やさしいActiveRecordのDB接続のしくみ
boro1234
14
7.3k
テーブル定義変更の ガイドラインを作った話
boro1234
2
1.3k
正規化理論ことはじめ -数学的背景から理解する正規化の初手-
boro1234
0
790
CakePHPの内部実装 から理解するPSR-7
boro1234
0
1.2k
Other Decks in Programming
See All in Programming
KubeCon + CloudNativeCon NA 2024 Overviewat Kubernetes Meetup Tokyo #68 / amsy810_k8sjp68
masayaaoyama
0
250
創造的活動から切り拓く新たなキャリア 好きから始めてみる夜勤オペレーターからSREへの転身
yjszk
1
130
開発者とQAの越境で自動テストが増える開発プロセスを実現する
92thunder
1
180
Security_for_introducing_eBPF
kentatada
0
110
Итераторы в Go 1.23: зачем они нужны, как использовать, и насколько они быстрые?
lamodatech
0
770
複雑な仕様に立ち向かうアーキテクチャ
myohei
0
170
これでLambdaが不要に?!Step FunctionsのJSONata対応について
iwatatomoya
2
3.6k
情報漏洩させないための設計
kubotak
1
130
php-conference-japan-2024
tasuku43
0
270
17年周年のWebアプリケーションにTanStack Queryを導入する / Implementing TanStack Query in a 17th Anniversary Web Application
saitolume
0
250
Beyond ORM
77web
5
660
Jakarta EE meets AI
ivargrimstad
0
240
Featured
See All Featured
Embracing the Ebb and Flow
colly
84
4.5k
The Pragmatic Product Professional
lauravandoore
32
6.3k
Writing Fast Ruby
sferik
628
61k
jQuery: Nuts, Bolts and Bling
dougneiner
61
7.5k
Facilitating Awesome Meetings
lara
50
6.1k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
111
49k
Producing Creativity
orderedlist
PRO
341
39k
Art, The Web, and Tiny UX
lynnandtonic
298
20k
GitHub's CSS Performance
jonrohan
1030
460k
Code Reviewing Like a Champion
maltzj
520
39k
How GitHub (no longer) Works
holman
311
140k
Making Projects Easy
brettharned
116
5.9k
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 姓名
年齢 生年月日 住所 個人番号 星座 性別 郵便番号