3

私はPHP/MySQLでWebアプリに取り組んでおり、ユーザー/グループの関連付けを作成する必要があります。

これが私が狙っているものです:

  • グループやユーザーの数は増え続けます。


  • ユーザーは、いつでもグループの関連付けを変更できるようになります。

  • グループアソシエーションは
    、サイトに表示されるコンテンツの優先順位を決定します。

  • ユーザーに送信される電子メールの更新は、現在のグループの関連付けによって決定されます。

私の質問は、このユーザー/グループの関連付けを処理するための最良の方法は何ですか?

私の現在のテーブル構造は次のようになります(通信を容易にするために簡略化されています)。

Users:
User_ID, User_name, Fname, Lname, is_dealer

Deals:
Deal_ID, Dealer_ID, Deal_name, Deal_content

Dealers:
Dealer_ID, User_ID, Dealer_name, Dealer address.. etc.

私の最初の考えは、Group_ID列とGroup_name列を持つGroupsテーブルを作成することです。次に、次の2つのいずれかを実行できます。

「User_ID」という名前の列をGroupsテーブルに作成できます。グループの関連付けごとに、Group_ID、Group_name、およびUser_IDを示す行があります。このオプションは、巨大な超冗長データベーステーブルを作成するように感じます。

私が考えることができる他のオプションは、UsersテーブルにGroup_ID列を作成し、解析する必要のあるテキストのある種の配列で、ユーザーが関連付けられているすべてのグループをその列に入力することです。ここでの問題は、グループの数に制限がないことです。ユーザーのグループの関連付けをすべて、ユーザーテーブルの各行の1つの「値」に詰め込むのは非常に難しいようです。

本当にこれはSQLデータベースのロジック/設計の問題です。どんな援助も大きな助けになるでしょう。

ありがとう!

4

3 に答える 3

10

ユーザーをグループに関連付けるテーブルを作成するだけです。2 つの列: 1 つは一意の user_id を格納し、もう 1 つは一意の group_id を格納します。

user_id-group_id の組み合わせを一意にする場合、このテーブルに一意のキーは必要ありません。2列で十分です。

+---------+      +------------+
| user    |      | user2group |     +----------+
+---------+      +------------+     | group    |
| user_id |----->| user_id    |     +----------+
| name    |      | group_id   |<----| group_id |
| pass    |      +------------+     | name     | 
| ...     |                         | ...      |
+---------+                         +----------+

私の記憶が正しければ、これは正規化の 3 つのステップの 1 つです。たぶん、これを見てください。

于 2013-03-03T14:15:07.110 に答える
1

クロステーブルを作成する必要があります。

ユーザーをそのままにして、次の 2 つのテーブルを作成します。

Groups:
Group_ID, Group_name

Groups_Users:
Group_ID, User_ID

これは、冗長データのない典型的な n:m の関係です。

于 2013-03-03T14:12:41.017 に答える
0

私の意見では、USERSをGROUPSテーブルにリンクするには

u_g_realationship という 3 番目のテーブルを作成する必要があります。

テーブル構造

id    user_id    group_id
--    -------    --------
1     2          7
2     2          5

これにより、リレーションシップを 1 つの列に詰め込む場合に比べて、リレーションシップの更新または削除が非常に簡単になります。

これでアレックスの問題が解決することを願っています。

于 2013-03-03T14:15:52.307 に答える