数据库规范化 - 外键或主键
Database normalization - Foreign Keys or Primary Keys
我对 Foreign Keys
和 Primary Keys
感到困惑。
我在以下方面对数据进行了规范化:
这是 table Users
列出所有用户的地方,ID 是 Primary Key
:
CREATE TABLE Users
(
Id INT IDENTITY,
Name NVARCHAR(60),
Email NVARCHAR(60),
Password BINARY(60),
PRIMARY KEY (Id)
)
有 FreeTime
table,其中存储了空闲时间的可能性(如阅读、运动、旅行等...),Id 为 Primary Key
:
CREATE TABLE FreeTime
(
Id INT IDENTITY,
Description NVARCHAR(60),
PRIMARY KEY (Id)
)
UserFreeTime
下面的Table为每个用户存储所有选择的FreeTimeId
(每个用户可以select任意多的空闲时间花费方式):
CREATE TABLE UserFreeTime
(
UserId INT,
FreeTimeId INT
)
那么UserFreeTime
、table、UserId
和FreeTimeId
应该是外键还是主键呢?或者我根本不需要这个 table 的任何密钥?
您正在寻找这样的东西。
CREATE TABLE UserFreeTime
(
UserId INT,
FreeTimeId INT,
PRIMARY KEY(UserId, FreeTimeId),
FOREIGN KEY(Userid) REFERENCES Users(Id),
FOREIGN KEY(FreetimeId) REFERENCES FreeTime(Id)
)
这里使用主键保证一个用户可以有多个不同的freetime活动但是任意一对user,freetime不能重复。
作为旁注,我强烈建议对表和列使用小写字母。
回答你的问题。让我们先了解什么是主键,什么是外键。
http://www.dotnettricks.com/learn/sqlserver/difference-between-primary-key-and-foreign-key
简而言之
- 主键:如果要使列在 table 中唯一且独立于任何其他 table,请将其作为主键。
- 外键:如果要使列依赖于另一个 table 中的另一列,请使用外键约束
你的情况:
- 用户 table 将拥有独立于任何其他 table 的用户,因此用户 table 的 ID 列将是主要的。
- FreeTime table 也独立于任何其他 table,因为它仅包含空闲时间详细信息,因此将此 table 的 Id 列作为主要列。
- UserFreeTime 详细信息有两列 UserId 和 FreeTimeId,它们依赖于 User table 和 free tie table 因为用户不能与 User table 和FreetimeId 不能与 FreeTime table 中存在的不同,因此您必须将 UserId 列作为外键引用 User table 的 Id 列,并将 FreeTimeId 列作为外键引用 FreeTime [=35] 的 Id 列=].
希望对您有所帮助!
我对 Foreign Keys
和 Primary Keys
感到困惑。
我在以下方面对数据进行了规范化:
这是 table Users
列出所有用户的地方,ID 是 Primary Key
:
CREATE TABLE Users
(
Id INT IDENTITY,
Name NVARCHAR(60),
Email NVARCHAR(60),
Password BINARY(60),
PRIMARY KEY (Id)
)
有 FreeTime
table,其中存储了空闲时间的可能性(如阅读、运动、旅行等...),Id 为 Primary Key
:
CREATE TABLE FreeTime
(
Id INT IDENTITY,
Description NVARCHAR(60),
PRIMARY KEY (Id)
)
UserFreeTime
下面的Table为每个用户存储所有选择的FreeTimeId
(每个用户可以select任意多的空闲时间花费方式):
CREATE TABLE UserFreeTime
(
UserId INT,
FreeTimeId INT
)
那么UserFreeTime
、table、UserId
和FreeTimeId
应该是外键还是主键呢?或者我根本不需要这个 table 的任何密钥?
您正在寻找这样的东西。
CREATE TABLE UserFreeTime
(
UserId INT,
FreeTimeId INT,
PRIMARY KEY(UserId, FreeTimeId),
FOREIGN KEY(Userid) REFERENCES Users(Id),
FOREIGN KEY(FreetimeId) REFERENCES FreeTime(Id)
)
这里使用主键保证一个用户可以有多个不同的freetime活动但是任意一对user,freetime不能重复。
作为旁注,我强烈建议对表和列使用小写字母。
回答你的问题。让我们先了解什么是主键,什么是外键。
http://www.dotnettricks.com/learn/sqlserver/difference-between-primary-key-and-foreign-key
简而言之
- 主键:如果要使列在 table 中唯一且独立于任何其他 table,请将其作为主键。
- 外键:如果要使列依赖于另一个 table 中的另一列,请使用外键约束
你的情况:
- 用户 table 将拥有独立于任何其他 table 的用户,因此用户 table 的 ID 列将是主要的。
- FreeTime table 也独立于任何其他 table,因为它仅包含空闲时间详细信息,因此将此 table 的 Id 列作为主要列。
- UserFreeTime 详细信息有两列 UserId 和 FreeTimeId,它们依赖于 User table 和 free tie table 因为用户不能与 User table 和FreetimeId 不能与 FreeTime table 中存在的不同,因此您必须将 UserId 列作为外键引用 User table 的 Id 列,并将 FreeTimeId 列作为外键引用 FreeTime [=35] 的 Id 列=].
希望对您有所帮助!