私は現在、大学のプロジェクトで働いていますが、機能の依存関係の部分について少し混乱しています。このプロジェクトでは、自分のプロジェクト仕様に基づいて論理データモデルを作成し、機能の依存関係も決定する必要がありました。
たとえば、「ユーザー」テーブルに次の属性を指定しました。
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
しかし、講義スライドの他の例を見ると、これが正しいのか疑問に思っています。
「username」が一意かつ必須(一意であり、nullではない)の場合、それは候補キーです。リレーショナルモデリングでは、1つの候補キーと別の候補キーの間に理論的な違いはありません。より具体的には、リレーショナルモデリングでは、1つの候補キーを選択して「主キー」というラベルを付ける理論上の理由はありません。キーはキーです。
だからあなたは正しい。ここには2つの機能の依存関係があります。 (または、右側を個々の列に分解する場合は8。user_id -> username
、user_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でない場合、これは候補キーであり、属性のセットも識別します。
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です。
もちろん、特定のケースではいくつかのステップを省略でき、Ai
とBj
の代わりに列がありますが、うまくいけばアイデアを理解できます。
他の人が言ったことに加えて、属性(または属性のセット)が候補キーである場合、all属性は機能的に依存する必要があります。
すべての属性は機能的にキーに依存しているため、other機能依存がある場合、自動的に になります。推移的な依存関係 および3NFの違反。したがって、「非キー」の依存関係は、正規化エラーを発見するための赤旗として機能する可能性があります。
同様に反対の方向から考えることもできます。まず、ドメインでどの機能の依存関係が理にかなっているのかを理解し、次にそれらを使用して、キーとして機能できる属性を特定します。