3

C#/。NET WinForms/Desktopアプリケーションにセキュリティを追加する必要があります。OracleDBバックエンドを使用しています。

テーブルは単純です:User(ID、Name)、Role(ID、Role)、UserRole(UserID、RoleID)。

Windowsアカウント名を使用してユーザーテーブルにデータを入力しています。今のところ、ロールテーブルは単に「Admin」、「SuperUser」、「BasicUser」になります。

2人が同じWindowsアカウント名を持つことは不可能だったので...これらの名前管理を制御していなくても(netopsは制御しているので、Windowsアカウントを使用したいので、管理する必要はありません;))。ロールテーブルの場合、重複値を設定することはできません。入力を制御します。入力は3つだけです(戦術アプリは1年以内に廃止されます)。UserRoleは、ユーザーとロールの多対多の関係を表す結合テーブルであるため、サラグキーは正当化されません。

簡単な質問-ユーザーとロールのテーブルで「ID」(int)を気にするのはなぜですか?ここで何かポイントや利点はありますか?これは「私はいつもこのようにしてきた」タイプのものの1つですか?それとも、しばらくの間これを行わず、理由を忘れたことがありますか?

4

2 に答える 2

2

名前が変更されます-主キーの値は変更できません。AbigailSmithがAbigailJonesになり、ユーザー名が変更されますが、代理キーは、これらの変更をどこにでもカスケードする必要がないように保護します。

代理キーを使用しているが、一意である必要がある列または列の組み合わせがある場合は、一意のインデックスを使用してそれを適用します。とにかくuser.name列とrole.role列にインデックスが必要になる可能性が高く、一意のインデックスはスペース効率が高く、オプティマイザーに有用なメタデータを提供します。代理キーはあるが、行を一意に識別する列の別の組み合わせがない場合は、エンティティ定義が正しいかどうかをもう一度考えてください。

1つの注意。特に、アクセスパスが少ない非常に狭いテーブルの場合は、インデックス編成テーブルを使用できます。Oracleは、主キーのインデックス編成テーブルのみを許可しますが、一意の列セットに対する外部キーを許可します(一意のインデックスだけでなく、一意の制約によって強制される場合)。

一意のIDが一意のインデックスを介して適用され、ORMによってPKとして扱われ、外部キー関係の親として使用されるテーブルが作成される可能性がありますが、主キー(DBで定義されている)インデックス編成テーブルのドライバーとして必要なため、はrolename / username/whateverです。

于 2010-12-15T23:51:59.250 に答える
1

交差テーブルには代理キーは必要ありませんが、そうする理由はいくつかあります。

  • 一貫性:すべてのテーブルに単一の人工キーがある場合、テーブル名を知っているときは常にキー名を知っています。
  • 使いやすさ:入力が少ない— 1つの重要な手段ONWHERE句が短く、エラーが発生しにくくなっています。
  • 相互運用性:一部のORMは、単一の主キー列を持つテーブルでのみ適切に機能します。
于 2010-12-15T20:13:52.790 に答える