8

ユーザー/役割システムを設計したい:

ユーザーには名前とパスワードがあり、ユーザーは のようないくつかの役割を持つことができます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)
)

役割:

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

    CONSTRAINT [PK_Roles] PRIMARY KEY CLUSTERED ([id] ASC)
)

ユーザーの役割:

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)
)

私の質問は: 外部キーを使用する必要がありますUser_Roles.User_id -> User.Id

はいの場合、なぜですか?

4

5 に答える 5

10

何を言っているのかよくわかりませんが...

  • User_Roles2列のみを持つ必要がUser_idありRole_id
    、これらの両方が主キーを形成します
  • 追加の id 列は必要ありませんUser_Roles
  • User_idへの外部キーですUsers.id
  • Role_idへの外部キーですRoles.id

編集:今、私は理解しています。はい、常に外部キーを使用します

また...

  • である場合、これはプレーン テキストを意味しますpasswordこれはまずいnvarchar(50)
  • に重複nameした値がUsersある場合、どのユーザーがどのユーザーであるかをどのように知ることができますか?
    特に、彼らが同じパスワードを持っている場合 (私たちミートサックが愚かなために起こります)

主キーの作成後にコメントの後に編集...

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])
)
于 2012-06-04T09:41:48.560 に答える
1

Spring Security はのように推奨しています。

create table users(
    username varchar_ignorecase(50) not null primary key,
    password varchar_ignorecase(50) not null,
    enabled boolean not null
);

create table authorities (
    username varchar_ignorecase(50) not null,
    authority varchar_ignorecase(50) not null,
    constraint fk_authorities_users foreign key(username) references users(username)
);
create unique index ix_auth_username on authorities (username,authority);
于 2015-05-18T20:00:15.383 に答える
0

データがリレーションをモデル化する場合は、常に外部キーを使用してください。あなたのサンプルでは、​​外部キーを作成しない場合、あなた (またはデータベースにアクセスできる他の誰か) が現在使用されているロールを誤って (または故意に) 削除することを妨げるものは何もありません。

多くのユーザーといくつかの役割があるとします。役割の 1 つは「管理者」と呼ばれ、アプリケーションでいくつかのタスクを実行するために必要です。外部キーが設定されていない場合、誰かが admin ロールを削除するのを防ぐ手段がデータベースにないため、アプリケーションで次のことが発生します。

  • データベースに存在しなくなったロールを探すため、おそらくクラッシュします
  • 上記でない場合、少なくとも「管理者」ロールを持つユーザーはいないため、アプリケーションの必要な部分が閉じられます。

一方、外部キーをセットアップした場合、(User_Roles テーブルを介して) 現在ユーザーに割り当てられているロールを削除しようとすると、データベースからエラーが返されます。

于 2012-06-04T11:34:50.480 に答える
0

users_roles テーブルには、各ユーザーとその役割の間のマッピングが含まれている必要があります。各ユーザーは多くのロールを持つことができ、各ロールは多くのユーザーを持つことができます:

TABLE users
  id INTEGER NOT NULL PRIMARY KEY,
  userName VARCHAR(50) NOT NULL

TABLE roles
  id INTEGER NOT NULL PRIMARY KEY,
  role VARCHAR(20) NOT NULL

CREATE TABLE users_roles (
  userId INTEGER NOT NULL,
  roleId INTEGER NOT NULL,
  primary key (userId, roleId),
  foreign key (userId) references users(id),
  foreign key (roleId) references roles(id)
);
于 2019-08-14T09:13:47.460 に答える