Upgrade to Pro — share decks privately, control downloads, hide ads and more …

RDBおける候補キーを求めるためのアルゴリズム

Avatar for kubo ayumu kubo ayumu
August 27, 2022

 RDBおける候補キーを求めるためのアルゴリズム

Avatar for kubo ayumu

kubo ayumu

August 27, 2022
Tweet

More Decks by kubo ayumu

Other Decks in Programming

Transcript

  1. © 2022 for LANCERS, Inc. All Rights Reserved 2 2

    久保 路(くぼ あゆむ) ・ 2020.04 ~ 2021.12 BIチームに所属しSalesforce管理・開発 ・ 2022.01~ 現在 QAチームに所属しCakePHP2→4への  バージョンアッププロジェクトに参画中 ・クエリチューニングをきっかけに  RDBの勉強にハマる ・クラフトビールが好き
  2. © 2022 for LANCERS, Inc. All Rights Reserved 3 3

    今日持ち帰っていただきたいこと ・候補キーとは一体何か ・候補キーを見つけることはなぜ重要なのか ・候補キーを求めるためのアルゴリズムはどのようなものか ・なんか面白そうという気持ち
  3. © 2022 for LANCERS, Inc. All Rights Reserved 4 4

    1 RDBにおける用語の整理 2 候補キーを求めるためのアルゴリズム 3 アルゴリズムの例 4 最後に アジェンダ
  4. © 2022 for LANCERS, Inc. All Rights Reserved 6 •

    いくつかの集合の組み合わせ(の部分集合)を指す • 例 名前の集合 D_1 = {太郎,花子,二郎}, 年齢の集合 D_2 = {20,25} の組み合わせから R = { (太郎,20), (花子,25), (二郎,20) }のようなリレーションができる • リレーションは表として実現することができる リレーションとは
  5. © 2022 for LANCERS, Inc. All Rights Reserved 7 •

    例 ◦ D_1 = {太郎,花子,二郎}, D_2 = {20,25} の組み合わせから R = { (太郎,20), (花子,25), (二郎,20) }のようなリレーションができる リレーションとは 名前 年齢 太郎 20 花子 25 二郎 20
  6. © 2022 for LANCERS, Inc. All Rights Reserved 8 •

    例 ◦ D_1 = {太郎,花子,二郎}, D_2 = {20,25} の組み合わせから R = { (太郎,20), (花子,25), (二郎,20) }のようなリレーションができる リレーションとは 名前 年齢 太郎 20 花子 25 二郎 20 列 / カラム
  7. © 2022 for LANCERS, Inc. All Rights Reserved 9 •

    例 ◦ D_1 = {太郎,花子,二郎}, D_2 = {20,25} の組み合わせから R = { (太郎,20), (花子,25), (二郎,20) }のようなリレーションができる リレーションとは 名前 年齢 太郎 20 花子 25 二郎 20 行 / タプル
  8. © 2022 for LANCERS, Inc. All Rights Reserved 10 •

    例 ◦ D_1 = {太郎,花子,二郎}, D_2 = {20,25} の組み合わせから R = { (太郎,20), (花子,25), (二郎,20) }のようなリレーションができる リレーションとは 名前 年齢 太郎 20 花子 25 二郎 20 属性名
  9. © 2022 for LANCERS, Inc. All Rights Reserved 11 •

    リレーションの属性名の集合Kが候補キーであるとは次を満たすこと ◦ リレーションの任意の行 t と sに対して tのKの値とsのKの値が一致すれば、tとsは完全一致する ◦ Kの自身を除く部分集合に対しては、上記は成り立たない 候補キーとは
  10. © 2022 for LANCERS, Inc. All Rights Reserved 12 •

    リレーションの属性名の集合Kが候補キーであるとは次を満たすこと ◦ リレーションの任意の行 t と sに対して tのKの値とsのKの値が一致すれば、tとsは完全一致する → Kの値さえ決まれば、行が一意に定まる ◦ Kの自身を除く部分集合に対しては、上記は成り立たない → Kを分解してしまうと、行を一意に識別できなくなってしまう 候補キーとは
  11. © 2022 for LANCERS, Inc. All Rights Reserved 16 姓名

    年齢 生年月日 住所 個人番号 星座 性別 郵便番号
  12. © 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 山羊座 各ドメインを組み合わせてリレーション「日本人」が作れる
  13. © 2022 for LANCERS, Inc. All Rights Reserved 19 姓名

    年齢 生年月日 住所 個人番号 星座 性別 郵便番号
  14. © 2022 for LANCERS, Inc. All Rights Reserved 20 姓名

    年齢 生年月日 住所 個人番号 性別 星座 郵便番号
  15. © 2022 for LANCERS, Inc. All Rights Reserved 21 姓名

    年齢 生年月日 住所 個人番号 性別 行を特定できる =候補キー
  16. © 2022 for LANCERS, Inc. All Rights Reserved 23 姓名

    年齢 生年月日 住所 個人番号 星座 性別 郵便番号
  17. © 2022 for LANCERS, Inc. All Rights Reserved 24 姓名

    年齢 住所 星座 性別 郵便番号 郵便番号を特定するのは 住所だけで十分
  18. © 2022 for LANCERS, Inc. All Rights Reserved 25 姓名

    年齢 住所 星座 性別 郵便番号 郵便番号を特定するのは 住所だけで十分 →郵便番号はこのリレーション  でわざわざ持つ必要がない
  19. © 2022 for LANCERS, Inc. All Rights Reserved 26 姓名

    年齢 住所 星座 性別 郵便番号 郵便番号を特定するのは 住所だけで十分 →郵便番号はこのリレーション  でわざわざ持つ必要がない →別のリレーションに  情報を持たせる(正規化)
  20. © 2022 for LANCERS, Inc. All Rights Reserved 27 •

    候補キーは行を一意に特定するキー • 正規化する上で候補キーを主軸に考慮する必要がある • そのため、候補キーが何であるかを特定することは重要
  21. © 2022 for LANCERS, Inc. All Rights Reserved 29 •

    リレーションの属性名の集合A,Bに対して関数従属性A→Bが存在すると は次を満たすことをいう ◦ リレーションの任意の行 t と sに対して tのAの値とsのAの値が一致すれば、 tのBの値とsのBの値が一致する 関数従属性とは
  22. © 2022 for LANCERS, Inc. All Rights Reserved 30 •

    リレーションの属性名の集合A,Bに対して関数従属性A→Bが存在すると は次を満たすことをいう ◦ リレーションの任意の行 t と sに対して tのAの値とsのAの値が一致すれば、 tのBの値とsのBの値が一致する → Aの値が決まれば、Bの値が一意に定まる 関数従属性とは
  23. © 2022 for LANCERS, Inc. All Rights Reserved 31 姓名

    年齢 生年月日 住所 個人番号 星座 性別 郵便番号
  24. © 2022 for LANCERS, Inc. All Rights Reserved 32 姓名

    年齢 生年月日 住所 個人番号 星座 性別 郵便番号
  25. © 2022 for LANCERS, Inc. All Rights Reserved 33 姓名

    年齢 生年月日 住所 個人番号 星座 性別 郵便番号
  26. © 2022 for LANCERS, Inc. All Rights Reserved 34 •

    リレーションの属性名の集合Xの閉包X+とは次のような集合である ◦ Xが決定項となる全ての関数従属性の 被決定項からなる属性名の集合 属性集合の閉包とは
  27. © 2022 for LANCERS, Inc. All Rights Reserved 35 •

    リレーションの属性名の集合Xの閉包X+とは次のような集合である ◦ Xが決定項となる全ての関数従属性の 被決定項からなる属性名の集合 → Xを決めれば一意に定まる全ての属性名の集合 属性集合の閉包とは
  28. © 2022 for LANCERS, Inc. All Rights Reserved 36 姓名

    年齢 生年月日 住所 個人番号 星座 性別 郵便番号 X
  29. © 2022 for LANCERS, Inc. All Rights Reserved 37 姓名

    年齢 生年月日 住所 個人番号 星座 性別 郵便番号 X+
  30. © 2022 for LANCERS, Inc. All Rights Reserved 38 姓名

    年齢 生年月日 住所 個人番号 星座 性別 郵便番号 X
  31. © 2022 for LANCERS, Inc. All Rights Reserved 39 姓名

    年齢 生年月日 住所 個人番号 星座 性別 郵便番号 X+
  32. © 2022 for LANCERS, Inc. All Rights Reserved 41 •

    リレーションの属性名の集合Kが候補キーであるとは次を満たすこと ◦ K+ が全ての属性の集合と一致する → Kの値さえ決まれば、行が一意に定まる ◦ Kの自身を除く部分集合に対しては、上記は成り立たない → Kを分解してしまうと、行を一意に識別できなくなってしまう 候補キーとは (閉包を用いた言い方)
  33. © 2022 for LANCERS, Inc. All Rights Reserved 43 1.

    K を 属性全体の集合 とおく 2. Kの各属性Aに対して以下を実行する {K - A}+が属性全体の集合となればK を K - A で置き換える そうでなければ、Kをそのままとする 3. 最終的に残ったKが候補キーとなる 候補キーを1つ求めるためのアルゴリズム
  34. © 2022 for LANCERS, Inc. All Rights Reserved 45 姓名

    年齢 生年月日 住所 個人番号 星座 性別 郵便番号
  35. © 2022 for LANCERS, Inc. All Rights Reserved 46 •

    住所が分かれば、郵便番号が分かる • 生年月日が分かれば、年齢・星座が分かる • 姓名・住所が分かれば、個人番号が分かる • 個人番号が分かれば、生年月日・性別・姓名・住所が分かる 以下を既知として、候補キーを見つける
  36. © 2022 for LANCERS, Inc. All Rights Reserved 47 1.

    K を 属性全体の集合 とおく 2. Kの各属性Aに対して以下を実行する {K - A}+が属性全体の集合となればK を K - A で置き換える そうでなければ、Kをそのままとする 3. 最終的に残ったKが候補キーとなる 候補キーを1つ求めるためのアルゴリズム(再掲)
  37. © 2022 for LANCERS, Inc. All Rights Reserved 48 姓名

    年齢 生年月日 住所 個人番号 星座 性別 郵便番号 K
  38. © 2022 for LANCERS, Inc. All Rights Reserved 49 1.

    K を 属性全体の集合 とおく 2. Kの各属性Aに対して以下を実行する {K - A}+が属性全体の集合となればK を K - A で置き換える そうでなければ、Kをそのままとする 3. 最終的に残ったKが候補キーとなる 候補キーを1つ求めるためのアルゴリズム(再掲)
  39. © 2022 for LANCERS, Inc. All Rights Reserved 50 姓名

    年齢 生年月日 住所 個人番号 星座 性別 郵便番号 A
  40. © 2022 for LANCERS, Inc. All Rights Reserved 51 姓名

    年齢 生年月日 住所 個人番号 星座 性別 郵便番号 K-A
  41. © 2022 for LANCERS, Inc. All Rights Reserved 52 姓名

    年齢 生年月日 住所 個人番号 星座 性別 郵便番号 {K-A}+
  42. © 2022 for LANCERS, Inc. All Rights Reserved 54 1.

    K を 属性全体の集合 とおく 2. Kの各属性Aに対して以下を実行する {K - A}+が属性全体の集合となればK を K - A で置き換える そうでなければ、Kをそのままとする 3. 最終的に残ったKが候補キーとなる 候補キーを1つ求めるためのアルゴリズム(再掲)
  43. © 2022 for LANCERS, Inc. All Rights Reserved 55 姓名

    年齢 生年月日 住所 個人番号 星座 性別 郵便番号 K:=K-A
  44. © 2022 for LANCERS, Inc. All Rights Reserved 56 姓名

    年齢 生年月日 住所 個人番号 星座 性別 郵便番号 A
  45. © 2022 for LANCERS, Inc. All Rights Reserved 57 姓名

    年齢 生年月日 住所 個人番号 星座 性別 郵便番号 K-A
  46. © 2022 for LANCERS, Inc. All Rights Reserved 58 姓名

    年齢 生年月日 住所 個人番号 星座 性別 郵便番号 {K-A}+
  47. © 2022 for LANCERS, Inc. All Rights Reserved 60 1.

    K を 属性全体の集合 とおく 2. Kの各属性Aに対して以下を実行する {K - A}+が属性全体の集合となればK を K - A で置き換える そうでなければ、Kをそのままとする 3. 最終的に残ったKが候補キーとなる 候補キーを1つ求めるためのアルゴリズム(再掲)
  48. © 2022 for LANCERS, Inc. All Rights Reserved 61 姓名

    年齢 生年月日 住所 個人番号 星座 性別 郵便番号 K:=K-A
  49. © 2022 for LANCERS, Inc. All Rights Reserved 63 姓名

    年齢 生年月日 住所 個人番号 星座 性別 郵便番号 K
  50. © 2022 for LANCERS, Inc. All Rights Reserved 64 姓名

    年齢 生年月日 住所 個人番号 星座 性別 郵便番号 A
  51. © 2022 for LANCERS, Inc. All Rights Reserved 65 姓名

    年齢 生年月日 住所 個人番号 星座 性別 郵便番号 K-A
  52. © 2022 for LANCERS, Inc. All Rights Reserved 66 姓名

    年齢 生年月日 住所 個人番号 星座 性別 郵便番号 {K-A}+
  53. © 2022 for LANCERS, Inc. All Rights Reserved 68 1.

    K を 属性全体の集合 とおく 2. Kの各属性Aに対して以下を実行する {K - A}+が属性全体の集合となればK を K - A で置き換える そうでなければ、Kをそのままとする 3. 最終的に残ったKが候補キーとなる 候補キーを1つ求めるためのアルゴリズム(再掲)
  54. © 2022 for LANCERS, Inc. All Rights Reserved 69 姓名

    年齢 生年月日 住所 個人番号 星座 性別 郵便番号 K
  55. © 2022 for LANCERS, Inc. All Rights Reserved 70 姓名

    年齢 生年月日 住所 個人番号 星座 性別 郵便番号 A
  56. © 2022 for LANCERS, Inc. All Rights Reserved 71 姓名

    年齢 生年月日 住所 個人番号 星座 性別 郵便番号 K-A
  57. © 2022 for LANCERS, Inc. All Rights Reserved 72 姓名

    年齢 生年月日 住所 個人番号 星座 性別 郵便番号 {K-A}+
  58. © 2022 for LANCERS, Inc. All Rights Reserved 74 1.

    K を 属性全体の集合 とおく 2. Kの各属性Aに対して以下を実行する {K - A}+が属性全体の集合となればK を K - A で置き換える そうでなければ、Kをそのままとする 3. 最終的に残ったKが候補キーとなる 候補キーを1つ求めるためのアルゴリズム(再掲)
  59. © 2022 for LANCERS, Inc. All Rights Reserved 75 姓名

    年齢 生年月日 住所 個人番号 星座 性別 郵便番号 K
  60. © 2022 for LANCERS, Inc. All Rights Reserved 76 1.

    K を 属性全体の集合 とおく 2. Kの各属性Aに対して以下を実行する {K - A}+が属性全体の集合となればK を K - A で置き換える そうでなければ、Kをそのままとする 3. 最終的に残ったKが候補キーとなる 候補キーを1つ求めるためのアルゴリズム(再掲)
  61. © 2022 for LANCERS, Inc. All Rights Reserved 77 姓名

    年齢 生年月日 住所 個人番号 星座 性別 郵便番号 候補キー!
  62. © 2022 for LANCERS, Inc. All Rights Reserved 78 •

    属性の選び方によって見つかる候補キーは異なる • 属性の数をN、関数従属性の数をPとすると、 閉包を求める計算はN×Pのオーダーの時間計算量となる • 候補キーの計算は結局、各属性に対して閉包を求めることになる ので、(N^2)×Pのオーダーの時間計算量となる
  63. © 2022 for LANCERS, Inc. All Rights Reserved 80 80

    今日持ち帰っていただきたいこと ・候補キーとは一体何か  →行を一意に特定する極小のキー ・候補キーを見つけることはなぜ重要なのか  →正規化において主軸となる要素のため ・候補キーを求めるためのアルゴリズムはどのようなものか  →全属性集合から各属性を順に取り除いて閉包を計算し   それが全属性集合と一致するかを判定する ・なんか面白そうという気持ち→どうでしたか
  64. © 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
  65. © 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+を求めるためのアルゴリズム
  66. © 2022 for LANCERS, Inc. All Rights Reserved 84 •

    リレーショナルデータベースの略 • リレーショナルデータモデルに基づいて実装されたDB それを管理するシステムがRDBMS • 例 ◦ MySQL ◦ SQL Server ◦ Oracle ◦ etc.. RDBとは
  67. © 2022 for LANCERS, Inc. All Rights Reserved 85 •

    集合(重複のない要素の集まり)を指す • 例 ◦ 人名の集合 D_name = {太郎,花子,二郎,....} ◦ 自然数の集合 D_natural = {1,2,3,4,5,...} ◦ 都道府県の集合 D_pref = {北海道,青森県,...} ◦ etc.. ドメインとは
  68. © 2022 for LANCERS, Inc. All Rights Reserved 86 姓名

    年齢 生年月日 住所 個人番号 星座 性別 郵便番号