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
920
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.2k
テーブル定義変更の ガイドラインを作った話
boro1234
2
1.2k
正規化理論ことはじめ -数学的背景から理解する正規化の初手-
boro1234
0
770
CakePHPの内部実装 から理解するPSR-7
boro1234
0
1.2k
Other Decks in Programming
See All in Programming
リアーキテクチャxDDD 1年間の取り組みと進化
hsawaji
1
220
タクシーアプリ『GO』のリアルタイムデータ分析基盤における機械学習サービスの活用
mot_techtalk
4
1.4k
3 Effective Rules for Using Signals in Angular
manfredsteyer
PRO
1
100
AWS Lambdaから始まった Serverlessの「熱」とキャリアパス / It started with AWS Lambda Serverless “fever” and career path
seike460
PRO
1
260
聞き手から登壇者へ: RubyKaigi2024 LTでの初挑戦が 教えてくれた、可能性の星
mikik0
1
130
Pinia Colada が実現するスマートな非同期処理
naokihaba
4
220
色々なIaCツールを実際に触って比較してみる
iriikeita
0
330
[Do iOS '24] Ship your app on a Friday...and enjoy your weekend!
polpielladev
0
100
macOS でできる リアルタイム動画像処理
biacco42
9
2.4k
アジャイルを支えるテストアーキテクチャ設計/Test Architecting for Agile
goyoki
9
3.3k
どうして僕の作ったクラスが手続き型と言われなきゃいけないんですか
akikogoto
1
120
【Kaigi on Rails 2024】YOUTRUST スポンサーLT
krpk1900
1
330
Featured
See All Featured
YesSQL, Process and Tooling at Scale
rocio
169
14k
Embracing the Ebb and Flow
colly
84
4.5k
Designing for Performance
lara
604
68k
Automating Front-end Workflow
addyosmani
1366
200k
Building Your Own Lightsaber
phodgson
103
6.1k
Optimizing for Happiness
mojombo
376
70k
Making the Leap to Tech Lead
cromwellryan
133
8.9k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
6
410
How to Think Like a Performance Engineer
csswizardry
20
1.1k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
0
89
The Cult of Friendly URLs
andyhume
78
6k
Happy Clients
brianwarren
98
6.7k
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 姓名
年齢 生年月日 住所 個人番号 星座 性別 郵便番号