web-dev-qa-db-ja.com

機能の依存関係を判別する方法

私は現在、大学のプロジェクトで働いていますが、機能の依存関係の部分について少し混乱しています。このプロジェクトでは、自分のプロジェクト仕様に基づいて論理データモデルを作成し、機能の依存関係も決定する必要がありました。

たとえば、「ユーザー」テーブルに次の属性を指定しました。
R(user_id、username、regDate、type、subscription)

主キー: user_id
一意のキー:ユーザー名
外部キー:サブスクリプション

データセットの例は次のようになります。

1、JohnS、01-01-2012、管理者、NULL
2、PeterB、2012年2月1日、モデレーター、映画
3、PeterA、2012年2月1日、ユーザー、映画
4、ゲーリー、2012年3月1日、ユーザー、書籍
5、アイリーン、2012年1月3日、ユーザー、映画
6、スタン、03-01-2012、ユーザー、映画
7、Isaac、2012年4月1日、ユーザー、書籍

私が理解していない部分は、機能の依存関係をどのように決定するかです。私の最初の感じは、2つの機能依存関係があり、これらは次のとおりであるというものでした。
ser_id->ユーザー名、regDate、タイプ、サブスクリプション
sername-> user_id、regDate、type、subscription

しかし、講義スライドの他の例を見ると、これが正しいのか疑問に思っています。

12
Shiraz

「username」が一意かつ必須(一意であり、nullではない)の場合、それは候補キーです。リレーショナルモデリングでは、1つの候補キーと別の候補キーの間に理論的な違いはありません。より具体的には、リレーショナルモデリングでは、1つの候補キーを選択して「主キー」というラベルを付ける理論上の理由はありません。キーはキーです。

だからあなたは正しい。ここには2つの機能の依存関係があります。 (または、右側を個々の列に分解する場合は8。user_id -> usernameuser_id -> regDateなど)

機能の依存関係は、理論的な観点から次のように定義されます( Wikipedia ):

関係Rが与えられた場合、R内の属性Xのセットは、各X値が正確に1つのY値に関連付けられている場合に限り、R内の別の属性Yのセット(X→Yと表記)を機能的に決定するといいます。次に、Rは関数依存性X→Yを満たすと言われます。

技術的な観点から、他の属性を一意に識別する属性を見つけようとしています。ショートカットとして、候補キーとそれらに依存する属性を決定します。 username, regDate, type, and subscriptionはすべてuser_idの値に依存するため、例は正しいです。 usernameが一意およびnullでない場合、これは候補キーであり、属性のセットも識別します。

6
Jordan Parmer

MySQLを使用していると想定しますが、そうでない場合は、他のRDBMSにアイデアを実装できます。

次のコマンドを実行して、すべてのテーブルを取得します。

show tables;

次に、すべてのテーブルを反復処理し、それぞれに対して次のコマンドを実行します。

show columns;

FDは次のように説明できます。

Determinant -> Dependent,
Determinant = {A1, ..., Am},
Dependent = {B1, ..., Bn}

ここで、AiおよびBjは列です。 DeterminantおよびDependentのすべての可能なシナリオを生成する必要があります。シナリオごとに、行列式の列が一致する少なくとも2つの別個のレコードが存在し、依存する列の少なくとも1つが一致しないかどうかを確認する必要があります。そうであれば、シナリオはFDではありません。そうでなければ、FDです。例:m = 3およびn = 2であると仮定します。

select count(*) from mytable t1, mytable t2 where ((t1.A1 = t2.A1) and (t1.A2 = t2.A2) and (t1.A3 = t2.A3)) and ((t1.B1 <> t2.B1) or (t1.B2 <> t2.B2))

fDルールに違反するレコードの数を返します。値が0の場合、シナリオはFDです。

もちろん、特定のケースではいくつかのステップを省略でき、AiBjの代わりに列がありますが、うまくいけばアイデアを理解できます。

2
Lajos Arpad

他の人が言ったことに加えて、属性(または属性のセット)が候補キーである場合、all属性は機能的に依存する必要があります。

  • 「機能依存」A-> Bは、Bの2つの異なる値が同じAに関連付けられていないことを単に意味します。 Wikipedia で少し正式な定義が与えられていますが、それは本質的にそれ。
  • キーは一意でなければならないため、2つのタプルに一部の属性の同じ値が含まれている場合でも、キーの値は異なっている必要があります。したがって、異なる値が同じキー値に関連付けられることはありません。

すべての属性は機能的にキーに依存しているため、other機能依存がある場合、自動的に になります。推移的な依存関係 および3NFの違反。したがって、「非キー」の依存関係は、正規化エラーを発見するための赤旗として機能する可能性があります。


同様に反対の方向から考えることもできます。まず、ドメインでどの機能の依存関係が理にかなっているのかを理解し、次にそれらを使用して、キーとして機能できる属性を特定します。

2