如何在SQL Server数据库中设计用户/角色架构?

gur*_*gui 8 sql-server

我想设计一个用户/角色系统:

用户有一个名称和密码,然后用户可以有几个角色,如Admin.

为此,我创建了一个这样的架构:

用户:

CREATE TABLE [dbo].[Users]
(
    [id] [int] NOT NULL,
    [name] [nvarchar](50) NULL,
    [password] [nvarchar](50) NULL,

    CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED ([id] ASC)
)
Run Code Online (Sandbox Code Playgroud)

角色:

CREATE TABLE [dbo].[Roles]
(
    [id] [int] NOT NULL,
    [name] [nvarchar](50) NULL,

    CONSTRAINT [PK_Roles] PRIMARY KEY CLUSTERED ([id] ASC)
)
Run Code Online (Sandbox Code Playgroud)

user_roles:

CREATE TABLE [dbo].[User_Roles]
(
    [id] [int] NOT NULL,
    [User_id] [int] NOT NULL,
    [Role_id] [int] NOT NULL,

    CONSTRAINT [PK_User_Roles] PRIMARY KEY CLUSTERED ([id] ASC)
)
Run Code Online (Sandbox Code Playgroud)

我的问题是:我应该使用外键吗? User_Roles.User_id -> User.Id

如果是,为什么?

gbn*_*gbn 8

不太清楚你的意思,但......

  • User_Roles应该只有2列User_id,Role_id
    这两列都构成了主键
  • 您不需要额外的id列 User_Roles
  • User_id 是一个外键 Users.id
  • Role_id 是一个外键 Roles.id

编辑:现在我明白了.是的,总是使用外键

也...

  • 如果passwordnvarchar(50),这意味着纯文本.这很糟糕.
  • 如果你有重复的nameUsers,你怎么知道哪个用户是哪个?
    特别是如果他们有相同的密码(这将发生因为我们的meatsacks是愚蠢的)

主键创建后的注释后编辑...

CREATE TABLE [dbo].[User_Roles]
(
    [User_id] [int] NOT NULL,
    [Role_id] [int] NOT NULL,

    CONSTRAINT [PK_User_Roles] PRIMARY KEY CLUSTERED ([User_id], [Role_id]),
    CONSTRAINT [UQ_ReversePK] UNIQUE ([Role_id], [User_id])
)
Run Code Online (Sandbox Code Playgroud)