如何将此架构更改为 3NF?
How do I change this schema into 3NF?
我创建了以下两个 table 用于历史课堂设置。这些 tables 将包含关于 wars 整个历史和其中一部分的国家的数据。
我的问题是 Wars
table 不在 3NF 中,因为 Combatants
字段中有多个值,因为一个字段中可以有很多战斗人员(即国家) war。
如何在不创建任何人工键的情况下将此架构更改为 3NF(即仅使用我当前拥有的字段)?
CREATE TABLE Wars (
Name CHAR(50) PRIMARY KEY,
StartingDate DATE NOT NULL,
EndingDate DATE NOT NULL,
Cause CHAR(50) NOT NULL,
Combatants CHAR(50) NOT NULL,
TodaysDate DATE DEFAULT SYSDATE,
CONSTRAINT CHK_TD CHECK(EndingDate < TodaysDate),
CONSTRAINT CHK_SD CHECK(StartingDate > 0);
CREATE TABLE Nations (
Name CHAR(50) PRIMARY KEY,
StartingDate DATE NOT NULL,
EndingDate DATE,
TodaysDate DATE DEFAULT SYSDATE,
CONSTRAINT CHK_TD CHECK(EndingDate < TodaysDate);
你得到的是一个 many-to-many 关系,其中一个 war 可以代表多个国家,一个国家可以代表多个 war。
在您的架构中表示:
1) 从您的 War table
中删除 "combatants" 字段
2) 创建一个 "NationsWars" table(或任何你想给它起的名字)。它只需要包含国家名称和 War 名称。
3) 这两个字段中的每一个都将有一个外键返回到它们各自父table的主键。
4) 这个新的 table 的主键将是一个由上述两个字段组成的复合键。
这是表示此类 many-to-many 关系的经典标准方式。
N.B。我不确定您为什么反对这里的人工钥匙。我会说数字 auto-increment ID 将是国家和 wars tables 的理想键...如果一个国家更改其名称,或者你意识到你输入错误,或者您想 re-label a war,那么您可以在不违反任何键约束的情况下这样做。使用名称或描述字段作为键通常被认为是不好的做法,因为从长远来看它们几乎总是会发生变化。主键应该是唯一和永久标识特定记录的东西,并且没有其他上下文含义。
我创建了以下两个 table 用于历史课堂设置。这些 tables 将包含关于 wars 整个历史和其中一部分的国家的数据。
我的问题是 Wars
table 不在 3NF 中,因为 Combatants
字段中有多个值,因为一个字段中可以有很多战斗人员(即国家) war。
如何在不创建任何人工键的情况下将此架构更改为 3NF(即仅使用我当前拥有的字段)?
CREATE TABLE Wars (
Name CHAR(50) PRIMARY KEY,
StartingDate DATE NOT NULL,
EndingDate DATE NOT NULL,
Cause CHAR(50) NOT NULL,
Combatants CHAR(50) NOT NULL,
TodaysDate DATE DEFAULT SYSDATE,
CONSTRAINT CHK_TD CHECK(EndingDate < TodaysDate),
CONSTRAINT CHK_SD CHECK(StartingDate > 0);
CREATE TABLE Nations (
Name CHAR(50) PRIMARY KEY,
StartingDate DATE NOT NULL,
EndingDate DATE,
TodaysDate DATE DEFAULT SYSDATE,
CONSTRAINT CHK_TD CHECK(EndingDate < TodaysDate);
你得到的是一个 many-to-many 关系,其中一个 war 可以代表多个国家,一个国家可以代表多个 war。
在您的架构中表示:
1) 从您的 War table
中删除 "combatants" 字段2) 创建一个 "NationsWars" table(或任何你想给它起的名字)。它只需要包含国家名称和 War 名称。
3) 这两个字段中的每一个都将有一个外键返回到它们各自父table的主键。
4) 这个新的 table 的主键将是一个由上述两个字段组成的复合键。
这是表示此类 many-to-many 关系的经典标准方式。
N.B。我不确定您为什么反对这里的人工钥匙。我会说数字 auto-increment ID 将是国家和 wars tables 的理想键...如果一个国家更改其名称,或者你意识到你输入错误,或者您想 re-label a war,那么您可以在不违反任何键约束的情况下这样做。使用名称或描述字段作为键通常被认为是不好的做法,因为从长远来看它们几乎总是会发生变化。主键应该是唯一和永久标识特定记录的东西,并且没有其他上下文含义。