2017-01-10 7 views
0

Database design: 3 types of users, separate or one table?を読んだあと、データベースをどのように設計するべきか混乱します。3つのロールを持つデータベース設計

---------------------- 1stデザイン----------------------

USERS

  • 名(PK)
  • パスワード
  • アカウントの種類(管理者、マネージャまたはワーカー)

PRO:I内のログを簡単にあれば取得することができますこのユーザーはAdmin、Manager、Workerです

CON:このデザインを使用して、関係を形成することはできません(1人のマネージャーから多数のワーカー)。

----------------------第2のデザイン----------------------

USERS

  • ユーザ名(PK)
  • パスワード

ADMINS

  • ユーザ名(USERS.usernameにPKとFK)
  • パスワード

MANAGERS

  • ユーザ名(USERS.usernameにPKとFK)
  • パスワード

労働者

  • 名(USERS.usernameにPKおよびFK)
  • 所有者(MANAGERS.usernameにFK)
  • パスワード

PRO:関係

CONを形成することができます。

  • ログインすると、 oユーザーがAdmin/Manager/Workerの場合は、表のそれぞれ を検索してください。
  • ADMINS、MANAGERS、WORKERSに複数のユーザ名が表示されても、強制するのは難しいです(大事!)

私は良いデザインのために数時間Googleを検索していますが、解決策は見つかりませんでした。私はこの種の要件がかなり共通していると確信していますか?いくつかの洞察力を提供してください!ありがとうございました!

+0

のMySQLやPostgreSQLが必要だと思いますか? – Jasen

+0

私はPostgreSQLを使用していますが、コンセプトは同じでなければなりませんか? – Zanko

+0

はい、すべてのタイプのリレーショナルデータベースで同じでなければなりません。質問全体を読むべきかどうかを判断しようとしていました。 – Jasen

答えて

1

最初のデザインと1対多の関係を形成することができます。ユーザーIDを参照するManagerIDを追加するだけです。

あなたはこのようなもので終わる:

UserID Username AcctType ManagerID 
1   Bob   Manager  NULL 
2   John  Worker  1 

別のオプションは、労働者と管理者の間の連結を行う第三のテーブルを追加することです。

Userテーブル:

UserID Username AcctType 
1   Bob   Manager 
2   John  Worker 
3   Mark  Worker 

UserLinkテーブル:

ManagerID UserID 
1   2 
1   3 
+0

こんにちは、ユーザーリンクテーブルの場合、そのようなデータ(1、2)(1,3)(2,3)があれば、データの整合性が発生する可能性があります... Worker to Worker?別の問題は、1人の作業者が多くの管理者を抱えている可能性があることですこれを強制する方法があれば教えてください!リンクテーブルがなければ、Manager/Adminが期待通りに動作することをどのようにして保証しますか?これはランダム値 – Zanko

+0

のマネージャIDではないAccTypeがAdmin/Managerの場合、ManagerIDをNULLにすることができますか? – Zanko

+0

UserLinkテーブルを使用すると、ワーカーは複数のマネージャを持つことができます。さらに、マネージャがマネージャを持つこともできます。 ManagerIDとUserIDの両方のフィールドは、Userテーブルにリンクする外部キーであるため、ガベージデータを持つことはできません。 – PhillipXT

1

黄金のデザインは次のようになります。

users (id, username, pass, ...) 
roles (id, role, ...) 
role_users(id, role_id, user_id, ...) 
0

別の方法:

users: 
    id    serial primary key 
    name   text 
    password  text 
    role   roletype  
    manager  int 
    managerrole roletype 

などの制約があります。

foreign key (manager,managerrole) references users (id,role) 

check (case when role = 'worker' then managerrole is not distinct from 'manager' and manager is not null else managerrole is null and manager is null end) 

今、第1の制約は、ユーザテーブルに存在するように管理者を強制的に、そして第2の制約は、ロールを持つユーザだけworker sがマネージャを持つことができることを強制し、すべてのそのようなmanager Sを持っていることを強制する第contraintを活用役割'manager'

私はあなたにもuniqueインデックスon (id, role) と通常のインデックスon (manager,managerrole)

+0

こんにちは、入力していただきありがとうございます!なぜ私たちは追加のマネージャロールフィールドが必要なのでしょうか?管理者/管理者の場合、マネージャ参照のみが値になるようにすることはできませんか? – Zanko

+0

それはそこにあるので、外部キーの制約は、マネージャー列が指すIDが適切な役割を果たすことを確認することができます。 – Jasen

+0

私は今あなたのポイントを見る! CHECK(CASE WHENロール!= 'ワーカー' THENマネージャーIS NULL END)は働いていません。なぜマネージャーが有効なマネージャーであるのかを確認することができないからです。この問題は非常に扱いにくく、単純な解決策ではありません。(解決策は "ハッキー"と感じます。) – Zanko

関連する問題