1

ユーザーが OAuth システム経由でログインし、ユーザー ID をセッションに保存する単純なアプリケーションを作成しています。

私のデータベースには、ユーザー、グループ、ページの 3 つのテーブルがあります。

  • ユーザーは多くのグループに所属できます
  • グループには多くのユーザーを含めることができます
  • ページには多くのグループを含めることができます

したがって、基本的に私の設定領域では:

  • ユーザーをグループに割り当てることができます
  • グループをページに追加して、アクセスを許可できます

次に、ユーザーの ID を使用して、ユーザーが属しているグループを見つけ、アクセスできるページ ID を選択します。ただし、この方法は非常に長く、かなりの数のループが必要になると思います (また、同じページ ID が多数返されるのではないでしょうか?)。

私の説明のスケッチアップ:

http://i.imgur.com/oFVsniH.png

ただし、これを達成するためのより良い方法があると感じています-1つの「ピボット」テーブルと3つのテーブルを使用しています...次のようなもの:

http://i.imgur.com/IZfhZO1.jpg

誰かが何が最善か、また私の関係 (MtM) が正しいかどうかについて洞察を与えることができれば、それは素晴らしいことです.

参考:Laravel 4でビルド

ありがとう!

4

4 に答える 4

3

通常、第 4 正規形は、1 つの交差テーブルに複数の多対多の関係を格納できないようにするためのものです。

この場合、ページへのアクセス権をユーザーではなくグループに付与します。そのため、グループ内のユーザー メンバーシップを示す同じテーブルにページへの参照を保存しません。

たとえば、グループに 1000 人のユーザーがいて、そのグループが 1 ページにアクセスできるとします。しかし、2 番目の設計では、ページへのグループのアクセスを 1000 行に格納する必要があります。

于 2013-06-24T20:28:54.153 に答える
1

最初のアプローチ (5 つのテーブルを使用) は、より正規化されています。非正規化する特別な理由がない限り、そのままにしておくことをお勧めします。

次の SQL は、特定のユーザーの個別のページ ID をすべて取得します。

select DISTINCT GP.page_id
from GroupUser GU
join GroupPage GP on GU.group_id = GP.group_id 
where GU.user_id = ?
于 2013-06-24T20:28:17.370 に答える
1

3 方向関係テーブルは、3 つのエンティティを結合するため、2 つの 2 方向関係テーブルとはまったく異なるものを意味します。

user1それがあなたのメンバーであることを説明したい場合group1は、最初の双方向テーブルでこれを使用します。

user     group
user1    group1

しかし、別のフィールドとページで拡張すると、意味が変わります。

user     group    page
user1    group1   page1

これにより、 と 、 、 だけでなく、 と の間の関連付けuser1も作成group1group1れます。page1user1page1

同時に、次のような非常に奇妙な状況が発生する可能性があります。

user     group    page
user1    group1   page1
user1    group1   page2
user1    group2   page1

この例では、 の行がないことに注意してくださいuser1 group2 page2。つまり、はuser1throughpage1のみに関連し、through(?!?)のみに関連します。これが最初に説明したものと一致しないことが明らかであることを願っています。group2user1group2page1

したがって、私の考えでは、最初の例の 2 つの関係テーブルを使用します。

于 2013-06-24T20:34:25.803 に答える
1

問題を述べた方法については、(最初​​の図で)行った方法の方が優れています。

ユーザーはグループに属し、ページの権限はグループにマップされます。ページとユーザーの間には直接的な関係はありません (つまり、ページにアクセスする権限をユーザーに直接割り当てることはできず、ユーザーが属するグループにのみ割り当てることができます)。上記が実行しようとしていることの正しい説明である場合、最初の図は、DB を設計するための最も標準化された方法です。

2 番目の図では、意味のない DB 関係に挿入することができます。たとえば、リンクテーブルにこれらの行を含めることができます

[user.id=1, group.id=1, page.id=1] 
[user.id=1, group.id=2, page.id=2]
[user.id=2, group.id=2, page.id=1]

これらの行により、グループ 2 はページ 1 とページ 2 (行 2 と 3) の両方にアクセスできます。しかし、ユーザー 2 はグループ 2 に属しており、ページ 1 (行 3) にしかアクセスできません。これを機能させることはできますが、Link のすべての行が意味を持つようにアプリケーションから制御する必要があります。

于 2013-06-24T20:38:59.180 に答える