use*_*967 5 normalization relational-theory
我有一个这样的表:L(A, B, C, D, E)
功能依赖项是:
AB -> CDE
C -> D
D -> B
D -> E
Run Code Online (Sandbox Code Playgroud)
我需要将此表转换为 3NF。我认为它甚至不在 2NF 中。我找到了 3 个候选键:
AB
D->B
我们可以更改AB->CDE
为AD->BCE
. 所以另一个候选键是AD
AC
(我不确定我这样做是否正确)。
从D -> E
(我认为有更多类似的依赖项)我假设该表不在 2NF 中。拆分此表以获得 3NF 的正确方法是什么?
我会采取以下方法。
从关系的左侧我们可以看到 3 个主键:
AB
具有关系的键AB->CDE
在表中表示LAB
。C
具有关系的键C->D
在表中表示LC
。D
与D->E
关系D->B
如LD
表所示。是否有意义?
CREATE TABLE LD (
D INT,
B INT, /* B can be omitted here, and derived from AB */
E INT,
CONSTRAINT LD_PKEY PRIMARY KEY ( D )
);
CREATE TABLE LC (
C INT,
D INT,
CONSTRAINT LC_PKEY PRIMARY KEY ( C ),
CONSTRAINT LC_D_FKEY FOREIGN KEY ( D ) REFERENCES LD
);
CREATE TABLE LAB (
/* Attributes D and E are dependent on C, so we don't store them here */
A INT,
B INT,
C INT,
CONSTRAINT LAB_PKEY PRIMARY KEY ( A, B ),
CONSTRAINT LAB_C_FKEY FOREIGN KEY ( C ) REFERENCES LC
);
Run Code Online (Sandbox Code Playgroud)