2

私は現在、ユーザーがウェブサイトからMinecraftサーバーを制御できるアプリケーションを作成しています(サーバーにインストールしたプラグインと対話します)。各サーバーが独自のユーザー権限グループを定義できるようにするための適切な設計を考え出そうとしています。最後に、各サーバーが選択して、作成したグループに割り当てるための事前定義された選択肢のリスト (私のプラグインが処理方法を知っているもの) があります。この Web サイトの 1 人のユーザーがサーバー パネルに複数のグループを持つことができ、ユーザーを複数のサーバー パネルに割り当てることができるようにすることを目指しています。

私が現在思いついたデータベースのレイアウトは次のとおりです。

Table: Roles     (will hold the predefined roles)
  Columns:
    serverTypeId (to distinguish between roles allowed for the 2 versions of minecraft)
    roleId       (the role's unique id, primary key)
    roleName     (some name to distinguish the role's purpose)

Table: ServerGroup (will hold the custom per server groups)
  Columns:
    serverId         (the server's unique id)
    groupId    (the server role's unique id, primary key)
    groupName  (name given to group, like Staff, Admin, etc)
    roleList         (a csv list of roleId's from the Roles table)

Table: ServerPermissions
  Columns:
    serverId       (the server's unique id)
    serverGroupId  (the server's groupId that this user belongs to)
    userId         (the user's id that is unique to the whole website)

これを行うより良い方法はありますか?これは私が思いついた最良の方法です。私は SQL に精通しておらず、改善する方法を探しています。

4

1 に答える 1

1

これはかなりしっかりした設計のように見えますが、注意点が 1 つあります。ServerGroup テーブルの roleList 列は、列内の反復グループと呼ばれるものであり、避ける必要があります。すべてのロール ID を 1 つの列に詰め込むのではなく、それを別のテーブルに分割します。これは、ロールとサーバー グループの間の一種のジャンクションとして機能します。

Table: ServerGroupRoles (will list roles for each ServerGroup)
  Columns:
    groupID (foreign key to ServerGroup)
    roleID (foreign key to Roles)
  Primary Key: groupID, roleID

ServerGroup が持つ役割ごとに、ServerGroupRoles に 1 つのレコードがあります。グループを繰り返すこのアプローチの利点は、検索と保守が容易なことです。ServerGroup の特定のロールの存在を確認するためのクエリは、LIKE を使用したインデックスのスキャンではなく、同等性を使用したインデックスのシークになる可能性があります。保守に関しては、ServerGroup からの役割の削除は、不必要にコストのかかる文字列操作ではなく、単純な DELETE/WHERE ステートメントです。

Web アプリケーションでアクセス許可を CSV 文字列として処理する必要がある場合、ServerGroupRoles に対するクエリから文字列を作成するのは簡単です。ただし、アプリケーションが変更された場合でも、グループの繰り返しによる非効率性に悩まされることはありません。

于 2012-05-17T14:18:09.100 に答える