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
1.3k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
RDBおける候補キーを求めるためのアルゴリズム
https://fortee.jp/phpcon-okinawa-2022/proposal/2674b12d-0aea-4d1e-9ad2-3d1338d2d0d4
kubo ayumu
August 27, 2022
More Decks by kubo ayumu
See All by kubo ayumu
MariaDB Connector/C のcaching_sha2_passwordプラグインの仕様について
boro1234
0
1.3k
caching_sha2_passwordのはなし
boro1234
0
2.8k
大テーブルと小テーブルのJOINのコスト計算の話
boro1234
5
2.1k
やさしいActiveRecordのDB接続のしくみ
boro1234
14
9.1k
テーブル定義変更の ガイドラインを作った話
boro1234
2
1.9k
正規化理論ことはじめ -数学的背景から理解する正規化の初手-
boro1234
1
1.2k
CakePHPの内部実装 から理解するPSR-7
boro1234
0
1.6k
Other Decks in Programming
See All in Programming
作るコストが小さくなった時代 幸せに働くために改めて考えたいこと 〜エンジニアとして価値を出し続けるために注視している二分野〜
yuppeeng
0
190
AI時代、エンジニアはどう育つのか -未経験エンジニアの成長を間近で見て考えたこと-
thasu0123
0
220
【QA Test Talk Vol.8】AI-DLC による Whole Team Approach の加速
pkshadeck
PRO
0
130
AWS DevOps AgentのAzure接続機能を検証して見えた活用法/Use Cases Verified for the AWS DevOps Agent's Azure Connectivity Feature
masakiokuda
1
220
PHP に部分適用が来るぞ!……ところで何それ?おいしいの? #phpcon / phpcon-2026
shogogg
0
600
2年かけて Deno に DOMMatrix を実装した話 / How I implemented DOMMatrix in Deno over two years
petamoriken
0
210
言葉の格闘技のススメ~紙とペンと言葉から始める、キャリアの描き方~
progresscicada
2
140
仕様駆動開発の消費期限
watany
18
7.5k
20260722_microCMSで考える、AI時代のコンテンツ運用設計
yosh1
0
380
「寝てても仕事が進む」Claude Codeで組む第二の脳
tomoyafujita2016
0
310
仕様書を書く前にハーネスを作る - Agent Native開発は「探索を速く、判定を固く」
gotalab555
4
1.6k
Go 1.27 における memory allocation の高速化
andpad
0
120
Featured
See All Featured
The Curious Case for Waylosing
cassininazir
1
450
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
630
The Art of Programming - Codeland 2020
erikaheidi
57
14k
First, design no harm
axbom
PRO
2
1.2k
The untapped power of vector embeddings
frankvandijk
2
1.8k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
Automating Front-end Workflow
addyosmani
1369
210k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
67k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
740
Design in an AI World
tapps
1
280
For a Future-Friendly Web
brad_frost
183
10k
We Have a Design System, Now What?
morganepeng
55
8.3k
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 姓名
年齢 生年月日 住所 個人番号 星座 性別 郵便番号