数据库规范化 - 外键或主键

Database normalization - Foreign Keys or Primary Keys

我对 Foreign KeysPrimary 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、UserIdFreeTimeId应该是外键还是主键呢?或者我根本不需要这个 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

简而言之

  1. 主键:如果要使列在 table 中唯一且独立于任何其他 table,请将其作为主键。
  2. 外键:如果要使列依赖于另一个 table 中的另一列,请使用外键约束

你的情况:

  1. 用户 table 将拥有独立于任何其他 table 的用户,因此用户 table 的 ID 列将是主要的。
  2. FreeTime table 也独立于任何其他 table,因为它仅包含空闲时间详细信息,因此将此 table 的 Id 列作为主要列。
  3. UserFreeTime 详细信息有两列 UserId 和 FreeTimeId,它们依赖于 User table 和 free tie table 因为用户不能与 User table 和FreetimeId 不能与 FreeTime table 中存在的不同,因此您必须将 UserId 列作为外键引用 User table 的 Id 列,并将 FreeTimeId 列作为外键引用 FreeTime [=35] 的 Id 列=].

希望对您有所帮助!