1

我一直试图在脑海中解决这个问题,但我真的被困住了,希望能得到一些帮助。鉴于方案

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

说这里的关键是 {a,b} 是否准确?如果这是真的,那么说属性 c,d 由于它们对 a 或 b 的部分依赖而需要在它们自己的表中是否也准确?导致以下方式的方案?

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

还是仅仅拥有

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

当然 a,b 必须以某种形式存在,因为它们是关键,对吧?我不是百分百确定。帮助理解这一点会很棒

4

1 回答 1

2

{a,b} 是 R 的唯一键。R 在 1NF 中。

为了达到至少 2NF,通过投影去除部分关键依赖。

  • r 1 {一个c}
  • r 2 { b d}

这是最低限度的覆盖。r 1和r 2都属于6NF。R 的密钥不需要存在,因为 R 不存在。但是 R 可以从 r 1和 r 2的笛卡尔积中恢复。

使用 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);

请注意,这会保留 FD a->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 回答