将表格转换为第三范式

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 个候选键:

  1. 第一个显然是 AB
  2. D->B我们可以更改AB->CDEAD->BCE. 所以另一个候选键是AD
  3. 使用类似的逻辑,我们得到另一个密钥 AC

(我不确定我这样做是否正确)。

D -> E(我认为有更多类似的依赖项)我假设该表不在 2NF 中。拆分此表以获得 3NF 的正确方法是什么?

fil*_*rem 1

我会采取以下方法。

从关系的左侧我们可以看到 3 个主键:

  • AB具有关系的键AB->CDE在表中表示LAB
  • C具有关系的键C->D在表中表示LC
  • 关键DD->E关系D->BLD表所示。

是否有意义?

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)