GRANVALLEY
データであなたの「ミチ」をてらす

GRANVALLEY

ブログBlog

データの関連性を見極める

多対多の関係は複雑になる可能性があります。特に、概要や分析方法、構築方法を理解していないデータについてです。

まずは、基本に戻り、「データベース」と「関連性」という言葉が何を意味するのか思い出してみましょう。これによりさまざまな問題を洗い出すことができます。

まずはデータベースです。これは、情報が必要な際に、アクセス、管理、更新などができるよう整理整頓する方法です。ご存知のように、データは、行、列、表にまとめられており、必要なものをすばやく簡単に見つけることができるように索引付けされています。データベース内のデータ間の「関連性」について説明するとき、この「関連性」は一つ以上のテーブルを結合するためのロジックを使用します。二つ以上の表の間にフィールドを接続することで関係を作成し、ダッシュボードウィジェット(ピボット・テーブルなど)に反映されるデータを決めます。関係には以下の三つのタイプがあります。

一対一:二つのテーブルを接続するときに使用するフィールドのすべての行に、一意の値しかありません。
一対多:一つのテーブルはすべての行に一意の値を持ち、もう一つのテーブルは最初のテーブルにある対応する値の一部またはすべてに重複する値を持ちます。
多対多:二つのテーブルの値が重複しているため、クエリが実行されるたびに過剰な計算が行われます。

多対多の関係と結果を理解する

多対多の定義:2つ以上のテーブルのフィールドに同じ値が含まれ、これらの値が両方のテーブルに複製されている場合、このフィールドに基づいて接続が行われ、多対多の関係が作成されるという一般的なルールです。

例としてビジネスシーンでの使用をとりあげます:
ホテルには、予約データが存在するテーブルと、支払いデータが存在するテーブルがあります。そのどちらのテーブルにも、宿泊者の名前が格納されています。宿泊者は、予約データのテーブル内に、名前に対して複数の予約データを持つことができ、支払いデータのテーブル内にも、名前に対して複数の宿泊データを持つことができます。ゲストの名前に基づいて予約データのテーブルと、支払いデータのテーブルの関係を作成する場合、多対多の関係が成立することになります(ゲストの名前は各テーブルに複数回表示されるため)。

問題点:
多対多の関係の問題点は、正しい結果を返さないか、もしくは過剰なコンピューティングリソースを使用して結果を返さないという複雑なデータセットを生み出してしまうことです。どちらの場合でも、重複や誤った結果、パフォーマンスの遅れなどのデータの混乱が生じてしまいます。そのため、多くの人が多対多の関係を回避しようとしています。

解決策:
ビジネスモデルやビジネス上の問題点に基づいて、選択されるべき対多の関係を解決もしくは回避するには、いくつかの方法があります。しかし最初のステップとしてやるべきことは、多対多の関係を扱っているかどうかを確認してから(次のセクションを参照)、スキーマのロジックに従って、最適な解決方法を選択することです。

関係の種類を決める

関係が多対多であるかどうかは、関係するデータをチェックして、各々の固有値と重複値の正確な数を調べることで簡単に確認することができます。

  1. 一意の値と重複する値の両方に同じ値が得られた場合、その関係に重複はなく、一対多または一対一のいずれかということになります。先ほどのホテルの例に置き換えると、すべての宿泊者IDは一度しか表示されず、すべての値が一意になるということです。この段階では、関係の相手側にIDの重複値があっても、一対多の関係を扱うことになります。一意の値は「予約テーブル」側で、重複した値は「支払いテーブル」側ということです。
  2. 重複する値の数が一意の値の数よりも多い場合、重複した値があるので、もう一方の側の関係を調べる必要があります。
    ・反対側の関係が一意の値をもたらす場合、これは一対多の関係です。
    ・そうでなければ、この関係に三つ以上のテーブルが関連付けられているので、多対多の関係ということになります。

多対多の関係を解決する最適な方法

多対多の関係を解決するにはいくつかの方法がありますが、ここでは存在するテーブルの関係の数だけでなく、多対多の関係の数にアプローチを当てて話します。二つのテーブルに一つの関係がある場合、最適な選択肢は以下の通りとなります。

  1. この関係を二つの別個の一対多の関係にします。
  2. 集計テーブルを作成します。

2つ以上のテーブルが存在し、1つ以上の関係がある場合、最適な選択肢は以下の通りとなります。

  1. lookup関数を使用して、あるテーブルから値をコピーし、論理テストに基づいて別のテーブルに値をインポートします。
  2. 2つのテーブルを1つにまとめる。

多対多の関係を理解するうえで最も重要なことは、正確で重複のないデータを確保することによって多対多の関係を回避する方法を知ることです。そうすれば、ユーザーエクスペリエンスが損なわれたり、クエリが妨げられたりすることもなく、パフォーマンスの悪化を防ぐことができるでしょう。BIツール「Sisense」を使い始める際に関係を構築するための5つの簡単なルールを持っています。

多対多の関係とSQLデータベース

SQLなどのリレーショナル・データベースは、参照整合性のおかげで多対多の関係を十分にサポートしています。これにより、エンティティ同士の関係性が適切になり、SQLはクエリによってこれらを組み合わせることができます。

これによりSQLは、ほかのプログラミングで実装した場合よりも多対多の関係をよりよく構築できます。ほとんどのプログラミング言語は、参照を参照先と一致させるサポートや、単純なトラバーサルを容易にするサポートがありません。

これを念頭に置いて、SQLデータベース内の多対多の関係をどのように視覚化するかを示す簡単な例を見てみましょう。

学生のデータを追跡するために、大学のアプリケーションで使用されているデータベースを例とします。このデータベースには、「生徒」と「論文」の2つのテーブルが含まれており、それぞれの生徒が受講することができる様々なクラスのデータが格納されています。

各生徒は、同時に異なる論文を取得します。これだけだと一対多の関係になります。各論文は一度に、多くの異なる学生によって研究されています。すなわち多対多の関係ということです。

では、SQLデータベースでこの多対多の関係を解決するにはどうすれば良いでしょうか?

この関係はテーブルを分解することができます。上記の例では、おそらく「Student_ID」、「Paper_ID」、「Semester」、および「Year」の列を含む3番目の表が存在します。固有の年度、そして固有の学期に固有の論文を受講した各学生は、表の新しい行に表示されることになります。Student_IDはStudentマスターテーブルを参照し、Paper_IDはPaper masterテーブルを参照します。これでできました!多くの学生は多くの科目に関連しています。

リレーションシップの両面に複数のインスタンスを作成する必要がある別の例を考えてみましょう。eコマースのウェブサイトでの注文追跡を例とします。

各顧客は1つのオーダーと関連があり、各オーダーには複数の商品を含ませることが可能です。さらに、各商品は複数の注文で表示される可能性があります。これは多対多の関係ということになります。

このような場合は追加のテーブルを作成する必要があります。これを「Items Ordered」とします。これはジャンクション・テーブルと呼ばれているもので、それぞれの値がどこと関係があるのかを示すことによって、多対多の関係を容易にすることを唯一の目的としています。

 

この投稿に記載されているすべてのデータは情報提供のみを目的としており、正確ではありません。前もってご了承ください。
本記事は、Sisense社の許諾のもと弊社独自で記事化しました。
https://www.sisense.com/blog/many-many-relationships-good-relationship/

Sisense は、Sisense Inc の商標または登録商標です。
※ その他の会社名、製品名は各社の登録商標または商標です。
※ 記事の内容は記事公開時点での情報です。閲覧頂いた時点では異なる可能性がございます。