このデータに最適なリレーショナルデータベース構造


8

次のシナリオのデータベーススキームを作成しています。

  • ユーザーがいます
  • ユーザーには役割があります(「開発者」や「CEO」など)
  • ロールにはアプリケーションがあります(「Topdesk」など)
  • アプリケーションには権限があります(「ナレッジベースの更新」など)
  • ロールがアプリケーションへのアクセス権をすでに持っている場合、ロールは権限を持つことができます

高性能環境がない(速度を最適化する必要がない)と仮定すると、このスキーマを実装する最良の方法は何でしょうか?データベース環境には、MySQL、MSSQLを使用できます。リレーショナルデータベースの設計が重要です。

私自身は次のことを考え出しました:

ERD図

もちろん、最も不確かな部分は、Applications_Permissions_Rolesテーブルです。これは、リンクテーブルですの上に別のリンクテーブル。これまで使用したことも、見たこともありません。それを行う別の方法は、それを役割と権限の間のリンクテーブルで置き換え、次にコードまたは制約を使用して必要な関係を確認することです...しかし、それは私にとって良い解決策のようではありません。これらのことは、コードレベルではなく、可能な限り(可能であると思われる場合)データベースレベルで実施する必要があります。

次に、Permissions.ApplicationとApplications.Idの間のリンクが必要ですか?Roles_Applicationsに行がない可能性があるため(新しいアプリケーションを追加した直後など)、どの権限がどのアプリケーションに属しているかを判別することができないため、これを使用します。また、権限が属するアプリケーションを検索するための単一の参照ポイントでもあります。これは正しいと思いますが、それはまた、データベース設計において円を描くものです。ON_DELETEまたはON_UPDATEをカスケードに設定しようとすると、MSSQLエラーが発生します。

何か提案、またはこれはどのように行われることになっていますか?命名規則などに関するその他の提案も(おそらくコメントとして)歓迎されます。

ありがとう、
Luc

編集:タイトルを変更しました。以前のものはより包括的でしたが、おそらく複雑すぎます。


役割、アプリケーション、およびアクセス許可の相互作用に頭を悩ませたかどうかはわかりません。各役割/アプリケーションには、役割の他のアプリケーションから独立した特定の権限がありますか?たとえば、CEO / Topdeskには読み取り権限しかなく、CEO / Calendarには書き込み権限があるかもしれません。
mdoyle 2013年

「このデータに最適なリレーショナルデータベーススキーマ」の意味がわかりません。どのエンジンを意味していますか?Postgres、MySQL、MSSQLなど...
jcolebrand

@jcolebrandタイトルが以前よりもはっきりしないと思います...おそらく「データベース構造」がより良い言葉です。テーブルのレイアウトと関係(外部キーなど)。
Luc

@mdoyleアクセス許可は常にアプリケーション内にあり(例:アプリケーション「windows」のアクセス許可「システムクロックの変更」)、したがって、アクセス許可は1つのアプリケーションにのみ属します。ロールは、権限とアプリケーションの両方を持つことができます。唯一の制約は、権限がある場合は、権限が属するアプリケーションへのアクセス権も必要であることです。(明らかに、Topdeskを使用できない場合、アプリケーションTopdeskに対する 'ナレッジベースの更新'権限はありません。)これにより、より明確になりますか?
Luc

それRoles_Applicationsが本当のことだとは思いません。すべての権限がアプリケーション固有であることを考えると、Applications_Permissions(あなたがラベル付けしたものPermissions)が存在するようであり、その後、のレコードを介して特定のロールに割り当てることができApplications_Permissions_Rolesます。 Roles_Applicationsは、実際には、最も基本的なアプリケーションの許可、つまり単純なアクセスを記述しているようです。または、ロールにはアプリケーションに対するある程度の権限があることを表明していますが、他の場所を調べてどの権限を決定する必要があります。
mdoyle 2013年

回答:


3

モデル化した方法は問題ありません。モデルにより、ビジネスルールがデータベースによって確実に適用されます。

代わりにできることがいくつかあります。1つは、の代理キーを削除することRoles_Applicationsです。交差テーブルとして、2つの外部キーを一緒に複合主キーとして使用できます。あなたはこれをしなかった場合は、それが伝播するだろうRoleし、ApplicationあなたにダウンApplications_Permissions_Rolesテーブル。これには、正規化を損なうことなく、アプリケーションの許可データの「ワンストップショップ」を増やす(結合の数を減らす)ことができるという利点があります。

もう1つの方法は、少し単純化して、各アプリケーションのデフォルトの権限を定義することです。「デフォルトアクセス」、「基本アクセス」、「ユーザー」など、わかりやすい名前を付けることができます。これにより、モデルをフラット化し、基本的にRoles_Applicationsテーブルを削除してにApplications_Permissions_Roles直接結合できますRoles。これにより、「どのロールがどのアプリケーションにアクセスできるか」を尋ねるために使用するクエリの性質が変わります。ただし、ビジネスルールはスキーマによって適用されます。


お返事をありがとうございます!私はこれらの提案をまだ考えていませんでした。ただし、2番目の提案では、多くのアプリケーションロジックが追加されます。そして、アプリケーションを扱うものは、デフォルトのパーミッションが適切に作成または削除されることを確認する必要があります。それはデータベースを簡素化しますが、より高いコストでそれは思われます。最初の提案はオプションですが、私はこれを実装すると思います。レビューをもう一度ありがとう:)
Luc

1

Roles_Applicationここでは実物を表すようには見えません。そのレベルが何であるかを確認するためにチェックアウトする必要がある場合でも、特定のロールがアプリケーションに対するあるレベルの権限を持っていることを示す以外に、それApplications_Permissions_Rolesは何ですか?例として、現在のモデルでアプリケーションカレンダーへの書き込みアクセス権を取得するCEOを次に示します。

役割

ID    Name
--    ----
1     CEO

用途

ID    Name
--    ----
C     Calendar

許可

ID    Application_ID  Permission
--    --------------  ----------
10    C               Write

Roles_Applications

ID    Role_ID    Application_ID
--    -------    --------------
50    1          C

Applications_Permissions_Roles

Role_Application_ID    Permission_ID
-------------------    -------------
50                     10

この一連の関係は、なしでモデル化できると思いますRoles_Applications。それを削除した場合(Joel Brownの提案どおりですが、「デフォルトのアクセス権」があると仮定する変更はありません):

役割

ID    Name
--    ----
1     CEO

用途

ID    Name
--    ----
C     Calendar

Applications_Permissions(nee Permissions

ID    Application_ID  Permission
--    --------------  ----------
10    C               Write

Applications_Permissions_Roles

Role_ID    Application_Permission_ID
-------    -------------
1          10

古いPermissionsテーブルには、「読み取り」や「書き込み」などの単純な権限はなく、「Topdesk」や「カレンダー」などのアプリケーションに適用できます。「Topdeskに書き込み」や「」などのアプリケーション固有の権限が含まれています「カレンダーに書き込む」と「Windowsでシステムクロックを変更する」わかりやすくするために、表に名前を付けましたApplications_Permissionsが、もちろんこれは必要な手順ではありません。

このアプローチには、Joelの2番目の提案と同様に、モデルをフラット化する効果がありますが、アプリケーションロジックやデフォルトのアクセス許可の概念は追加されません。 Roles_Applicationsロールがアプリケーションにある程度のアクセス権を持っていることを示す以外に、パーティーに何ももたらしていませんでした。その情報はApplications_Permissions_Roles、Role_IDの適切な値を持つレコードの存在によって、より簡潔に伝えられます。


さて、私はあなたが今何を意味するのかわかります。問題は、アプリケーションに対する権限を常に持っているとは限らないことです。Microsoft Wordと同様に、何もありません。これらの場合、どのロールがどのアプリケーションにアクセスできるかは不明です。ロールに割り当てられたそのアプリケーションからの少なくとも1つの権限が常に必要です。それが、Joel Brownからの「デフォルトの許可」の提案の目的でした。しかし提案をありがとう!それは悪い考えではなく、理にかなっていますが、私はそれを自分の状況に適用することはできません。*賛成票*
Luc

Wordのようなものについては、 "実行"は許可ではありませんか?しかし、なんらかの理由でアプリケーションの実行またはアクセスが許可と見なされない場合、私はあなたの主張を理解します。
mdoyle 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.