Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
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.2k
テーブル定義変更の ガイドラインを作った話
boro1234
2
2k
正規化理論ことはじめ -数学的背景から理解する正規化の初手-
boro1234
1
1.2k
CakePHPの内部実装 から理解するPSR-7
boro1234
0
1.6k
Other Decks in Programming
See All in Programming
FreeBSDでZabbixを動かす
kenkino
0
320
Security issues being discussed on Web Platforms
petamoriken
0
1.2k
Streamlitで実現する自然言語データアプリ開発
ayumu_yamaguchi
1
310
JPUG勉強会 OSSデータベースの内部構造を理解しよう(第2回)
oga5
0
270
一人だけ、Kiroが静止する日
hideg
0
130
マイコン向けの軽量Ruby「PicoRuby」で各種デバイスを制御するネイティブアプリの実現手法
bash0c7
0
440
個人開発基盤をまるごとCloudflareに引っ越して爆速で総合的体験を向上させた話
tinykitten
0
200
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
270
ゲームコントローラやキーボードのファームウェアをSwiftで書く
kishikawakatsumi
1
250
Webの地図
yosuke_furukawa
PRO
6
4.7k
すこし踏み込む CancellationToken
htkym
2
860
手動確認はもう限界 〜XCUITestでCustom URL Schemeの遷移を起動種別ごとに自動テストする〜 / Testing Custom URL Schemes with XCUITest
otouto
0
330
Featured
See All Featured
Building Adaptive Systems
keathley
44
3.2k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Design in an AI World
tapps
1
330
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.8k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
57k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.8k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
1k
Building AI with AI
inesmontani
PRO
1
1.2k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
5
720
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
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 姓名
年齢 生年月日 住所 個人番号 星座 性別 郵便番号