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

时间:2017-05-03 10:32:22

标签: mysql database foreign-keys primary-key database-normalization

我对Foreign KeysPrimary Keys感到困惑。

我的数据规范化如下:

这是表Users,其中列出了所有用户,ID为Primary Key

CREATE TABLE Users
(
    Id INT IDENTITY,
    Name NVARCHAR(60),
    Email NVARCHAR(60),
    Password BINARY(60),
    PRIMARY KEY (Id)
)

FreeTime表,其中存储了空闲时间的可能性(如阅读,运动,旅行等......),Id为Primary Key

CREATE TABLE FreeTime
(
    Id INT IDENTITY,
    Description NVARCHAR(60),
    PRIMARY KEY (Id)
)

下面的表UserFreeTime为每个用户存储所有选定的FreeTimeId(每个用户可以选择尽可能多的自由时间消费方式):

CREATE TABLE UserFreeTime
(
    UserId INT,
    FreeTimeId INT
)

那么UserFreeTime表,UserIdFreeTimeId应该是外键还是主键?或者我根本不需要这张桌子的任何钥匙?

2 个答案:

答案 0 :(得分:3)

您正在寻找类似的东西。

CREATE TABLE UserFreeTime
(
    UserId INT,
    FreeTimeId INT,
    PRIMARY KEY(UserId, FreeTimeId),
    FOREIGN KEY(Userid) REFERENCES Users(Id),
    FOREIGN KEY(FreetimeId) REFERENCES FreeTime(Id)
)

此处使用主键可确保用户可以拥有多个不同的空闲时间活动,但任何一对用户的空闲时间都不能重复。

作为旁注,我强烈建议在表格和列中使用小写字母。

答案 1 :(得分:0)

回答你的问题。让我们先了解什么是主键,什么是外键。

http://www.dotnettricks.com/learn/sqlserver/difference-between-primary-key-and-foreign-key

简而言之。

  1. 主键:如果要使表中的列唯一且与任何其他表无关,请将其设为主表。
  2. 外键:如果要使列依赖于另一个表中的另一列,请使用外键约束
  3. 在你的情况下:

    1. 用户表将使用户独立于任何其他表,因此用户表的Id列将是主要的。
    2. FreeTime表也独立于任何其他表,因为它只包含空闲时间详细信息,因此将此表的Id列作为主表。
    3. UserFreeTime详细信息有两列UserId和FreeTimeId,它们依赖于User表和free tie表,因为用户不能与User表中的内容不同,FreetimeId不能与FreeTime表中的内容不同,所以您必须将UserId列作为外键引用User列的Id列和FreeTimeId列作为FreeTime表的外键引用Id列。
    4. 希望它有所帮助!