2016-11-19 34 views
0

ユーザーの権限階層を追加しようとしています。子供、親、管理者DBのユーザー権限階層

私の考えは、ユーザー名とパスワードとアクセシビリティが0から2、0 - 子1 - 親2 - adminの一般的なユーザーテーブルを作成することですが、接続方法はわかりません彼らは異なる変数を持っているので、親テーブル/子テーブルへのユーザーテーブル。

Access picture of my database right now

明確な親/子は、ユーザーテーブルではもうこの絵のようにユーザー名/パスワードを持っていないだろうことができます。

更新:

DB using only one table for users

このテーブルには、これは子などであれば、変数「アクセシビリティ」という希望理にかなっている場合、私はフィードバックを望む空の唯一の親のためのフィールドを続けるだろう値が0から2の場合、親の子か管理者かどうかをコードで確認できます

+0

同じ情報を表す複数のエンティティがあるため、データベース設計が正規化されていません。 – Dai

+0

このデータベースはどのようなものですか?エンティティは何を表していますか? – Dai

+0

@Dai人名、姓などの基本情報より現実的かもしれない別のバージョンの表を追加しましたが、私はまだフィードバックを待っています。 – Higeath

答えて

0

2つの派生エンティティが同じスーパータイプインスタンスを共有できないようにするためのテーブル継承があります。 AccessとMS SQL Serverなどの

データベースはPostgreSQLがないかのようなテーブルの継承をサポートしていませんが、あなたのことができ、偽のそれ:

このスキーマは Parentまたは Childrenエンティティは、単一の特定なしでは存在できないことを意味し
TABLE Users (
    UserId int PRIMARY KEY IDENTITY(1,1), 
    UserName nvarchar(50) NOT NULL, 
    PasswordHash binary(32) NOT NULL, -- assuming sha256 
    PasswordSalt binary(8) NOT NULL 
) 

TABLE Parents (
    UserId int NOT NULL PRIMARY KEY, 
    -- insert parent-specific fields here 

    FOREIGN KEY UserId REFERENCES Users (UserId) 
) 

TABLE Children (
    UserId int NOT NULL PRIMARY KEY, 
    -- insert child-specific fields here 

    FOREIGN KEY UserId REFERENCES Users (UserId) 
) 

Userエンティティも存在します。しかし、Accessは実際のテーブル継承をサポートしていないので、またはChildrenの行だけがその値を持つように、とChildの値が同じUserIdの値を持つように、の値を簡単に制約できません。

幸いにも、(関係代数に関しては)数学的に正しいハッキングがありますが、残念ながらスーパークラス(User)がサブクラスを認識しているという点で残念ながらOOPの側面が壊れています。状況...

...とにかく。秘密のサブクラスを特定するUserの主キー(複合キーなので)にenum値を追加し、それぞれの "派生"テーブルで一致する定数(CHECK CONSTRAINTを介して適用される)複合キーコンポーネントを追加し、わずかな非効率性のコストでそう

ENUM UserType (HumanParent = 1, HumanChild = 2, Other = 3) 

TABLE Users (
    UserId int IDENTITY(1,1), 
    UserType UserType NOT NULL, 
    UserName nvarchar(50) NOT NULL, 
    PasswordHash binary(32) NOT NULL, -- assuming sha256 
    PasswordSalt binary(8) NOT NULL 

    PRIMARY KEY (UserId, UserType) 
) 

TABLE Parents (
    UserId int NOT NULL, 
    UserType UserType NOT NULL, 
    -- insert parent-specific fields here 

    PRIMARY KEY (UserId, UserType) 
    FOREIGN KEY (UserId, UserType) REFERENCES Users (UserId, UserType) 
    CHECK CONSTRAINT UserType = 1 
) 

TABLE Children (
    UserId int NOT NULL, 
    UserType UserType NOT NULL, 
    -- insert child-specific fields here 

    PRIMARY KEY (UserId, UserType) 
    FOREIGN KEY (UserId, UserType) REFERENCES Users (UserId, UserType) 
    CHECK CONSTRAINT UserType = 2 
) 

(: - のようなので、(リレーショナル代数は、ポータブルですが、列挙型のような概念とチェック制約が非常によく、MS Accessに必ずしもポートをない擬似-SQLを使用して)つまり、UserType列に必要な余分なストレージと、CHECK制約を評価するための計算コスト)があれば、データの正確性が保証されます。

これで楽しくアクセスできます:)