1

私は頭の中でこれを理解しようとしてきましたが、私は本当に行き詰まっていて、助けていただければ幸いです。スキームを考えると

R(a,b,c,d)
fd1: a->c
fd2: b->d

ここでの鍵は{a、b}であると言うのは正確でしょうか?それが本当なら、aまたはbのいずれかに部分的に依存しているため、属性c、dは独自のテーブルにある必要があると言うのも正確でしょうか?次のようなスキームになりますか?

R(a,b)
r1(a,c)
r2(b,d)

それとも単に持っているのが正しいでしょうか

R(a,c)
r1(b,d)

確かに、a、bはキーであるため、何らかの形で存在する必要がありますか?100%確信はありません。これを理解するのに役立ちます

4

1 に答える 1

2

{a、b}はRの唯一のキーです。Rは1NFにあります。

少なくとも2NFに到達するには、射影によって部分的なキーの依存関係を削除します。

  • r 1 { a c}
  • r 2 { b d}

これが最小カバーです。r1とr2の両方が6NFにあります。Rは存在しないため、Rのキーは存在する必要はありません。ただし、 Rは、r1とr2デカルト積から復元できます。

SQLを使用します。。。

create table t1 (
  a integer not null,
  b integer not null,
  c integer not null,
  d integer not null,
  primary key (a, b)
);

insert into t1 values
(1, 1, 10, 100),
(1, 2, 10, 200),
(2, 1, 20, 100),
(2, 2, 20, 200);

これにより、FDa->cおよびb->dが保持されることに注意してください。

create table t2 (
  a integer primary key,
  c integer not null
);

insert into t2
select distinct a, c from t1;

create table t3 (
  b integer primary key,
  d integer not null
);

insert into t3 
select distinct b, d from t1;

drop table t1;

これで、テーブルt2とt3のデータを確認できます。

select * from t2;
a   c
--
1   10
2   20

select * from t3;
b   d
--
1   100
2   200

そして、t2とt3のデカルト積を介してt1を回復できます。

select t2.a, t3.b, t2.c, t3.d
from t2, t3;
a  b   c  d
--
1  1  10  100
1  2  10  200
2  1  20  100
2  2  20  200
于 2012-12-07T02:56:39.453 に答える