4

ユーザーとグループの2つのエンティティがあります。最も簡単なモデルは、user(id、name、etc ...)、group(id、name)、user_group_rel(user_id、group_id)です。しかし、私はグループを他のグループに含める必要があります。1人のユーザーが多くのグループに属することができ、グループには、独自のユーザーとサブグループを持つユーザーとサブグループを含めることができます。データベースモデルの助けが必要です!

ユーザーとグループ

4

4 に答える 4

4

Ken Downの命名法には同意しますが、ユーザーと役割が同じエンティティであることに必ずしも同意するわけではありません。

基本エンティティ:

Users     (user_id, user name, real name, user_status, etc)
Role      (role_id, role name, role_password, etc)
Privilege (priv_id, base object, functionality, what have you)

連想エンティティ:

User has Role (0 - n) (user_id, role_id)
Role has Role (0 - n) (role_id, has_role_id)
User has Privilege (0 - n) (user_id, priv_id)
Role has Privilege (0 - n) (role_id, priv_id)
于 2011-02-18T15:46:32.267 に答える
3

最近では、これはユーザーとグループの両方を「役割」に折りたたむことによって行われます。ロールと、ロールを他のロールにリンクするだけです。一部のロールでは「ログイン」フラグが true に設定されているため、実質的にユーザーになりますが、「ログイン」フラグが設定されていないロールはグループに似ています。

主なアイデアは、これによりすべてが簡単になるということです。2 つの別個の概念またはエンティティ (ユーザーとグループ) を維持する必要はありませんが、ロールという 1 つの概念だけを維持する必要があります。次に、その「ログイン」フラグをユーザーに使用します。

編集:テーブル構造については、@ XIVSolutionsによって提供された最初のオプションを見てください。彼は私が上で言及したことを詳しく説明しています。これは、1 つの役割を任意の数の他の役割に配置することについての質問に答えます。2 番目の表である相互参照には、ロールとその親がリストされています。ロールに複数の親がある場合、つまりそのテーブルに複数のエントリがある場合、これは多くのグループに 1 人のユーザーがいるようなものです。

#DIT : また、@XIVSolutions テーブルの設計についても説明します。この 3 番目のテーブルは、ユーザー (ログイン) を個別に管理されるエンティティとして完全に正当な方法です。

于 2011-02-18T14:21:35.277 に答える
2

これをモデル化する際の主な問題は、ユーザーとグループの両方をグループのメンバーとして扱う方法です。ケンダウン症のアプローチは、この問題を解決します。別のアプローチは、ユーザーとグループを共通ベースタイプの派生タイプとして扱うことです。

create table groupmemberbase
(
  memberid int,
--optional flag to idicate the type of the derived entity
--this is similar to the login flag used by Ken Downs 
  membertype int,
  primary key (memberid)
)

create table users
{
  memberid int,
--more user attributes here
  primary key (memberid),
  foreign key (memberid) references groupmemberbase (memberid)
)

create table groups
(
  memberid int,
--more group attributes here
  primary key (memberid),
  foreign key (memberid) references groupmemberbase (memberid)
)

create table groupmembers
(
  groupid int,
  memberid int,
  primary key (groupid, memberid),
  foreign key (groupid) references groups (memberid)
  foreign key (memberid) references groupmemberbase (memberid)
)

このアプローチの利点の1つは、ユーザーまたはグループが誤ってユーザーのメンバーになるのを防ぐことです。この制限はスキーマレベルで適用されます。

于 2011-02-19T07:34:47.573 に答える
2

再:ケンダウンズソリューション:

私はこれの2つのバージョンで遊んだことがあります(そしてこれがターゲットに合っているかどうかを聞くのが大好きです...):

オプション1:

**tblRole**
RoleID PK
RoleName

**tblRoleIndex**
ParentRoleID FK on tblRole  
ChildRoleID FK ON tblRole

NOTE: ParentRoleID and ChildRoleID form a composite Primary key in the above table.

**tblLogIns**
LogInID PK
RoleID
PassWord

または、オプション2:

**tblRole**
RoleID
ParentRoleID Recursive FK on tblRole.RoleID
RoleName

NOTE: A top-level role in the table above has a default ParentRoleID of -1 or 0

**tblLogIns**
LogInID PK
RoleID
PassWord
于 2011-02-19T06:48:09.330 に答える