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

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

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

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 姓名

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