1

データベースの設計について少し質問があります。

「グループ」(ユーザーの)テーブルがあるとしましょう。このテーブルには、グループに関する情報 (作成日、名前など) を含む基本的なフィールドと、このグループのユーザーのリストを含むフィールドがあります。

ユーザーに関する情報を含む「users」テーブルがあります(本当に?)。ユーザーがグループを持つことを強制されていないため、このテーブルはグループ テーブルとリンクされていません。

グループでは、ユーザーは「社長」(1 人のみ) または「検査員」(数人) になることができます。

したがって、「グループ」テーブルには、社長のユーザー ID を含む「社長」フィールドがあります。そして、検査員 ID のリストを含む「検査員」フィールドが必要です。

このリストの処理方法がわかりません。おそらく、すべての ID を文字 (';' または '-') で区切って 1 つのテキスト フィールドに格納します...

別のテーブルを作成するのは奇妙に思えます。なぜなら、それはサイトのごく一部だからです。

これをどのように解決しますか?

4

3 に答える 3

7

このリストの処理方法がわかりません。おそらく、すべての ID を文字 (';' または '-') で区切って 1 つのテキスト フィールドに格納します...

これをしないでください。区切りリストをデータベース列に保存するのは本当に悪いことですか? を参照してください。

別のテーブルを作成するのは奇妙に思えます。なぜなら、それはサイトのごく一部だからです。

これは、多対多の関係を表現する正しい正規化された方法です。

ユーザーが最大で 1 つのグループにしか所属できない場合 (多対 1 の関係)、グループ メンバーシップをテーブルに格納し(ユーザーがどのグループにも属していない場合はusers列を残す)、そのテーブルでフラグを立てるかどうかを指定できます。NULLそれらのメンバーシップはpresidentまたはのメンバーシップであり、表に も含まれていない限り、scrutineerそうでないと仮定します。ただし、この場合、追加のテーブルに固執し、列に対する制約を定義したくなるでしょう。scrutineerpresidentgroupsUNIQUEuser

于 2013-07-19T14:04:52.573 に答える
3

ユーザーが複数のグループに所属できると仮定すると、多対多の関係になります。これは通常、関連付けテーブルを作成することで解決されます。

Groups
id, name

Users
id, email, etc.

Users_Groups
group_id, user_id
于 2013-07-19T14:07:04.333 に答える
1

一部の人が言ったように、それは多対多であるため、必要なのは、ユーザーとグループの関係を格納するための中間テーブルです。ユーザーがメンバーであるすべてのグループは、中間テーブルのエントリです。これを「メンバーシップ」と呼びます。これは、メンバーシップの種類を格納する場所です。プレジデンシーなどは、グループに対するユーザーの関係を記述するため、メンバーシップ テーブルは保存する論理的な場所です。

この種のアーキテクチャは、もう少し複雑なクエリ (結合など) に慣れると、それほど困難ではなくなります。

アーキテクチャと比較してください -- グループの社長の ID を取得する

SELECT PresidentID FROM Groups WHERE GroupID=...

に:

SELECT UserID FROM Membership WHERE IsPresident=TRUE AND GroupID=...

または同じクエリで、 -- のみがすべてIsScrutineer=TRUEの を返します。次に、これはメンバーを反復処理するのがはるかに簡単になり、解析は必要ありません。UserIDScrutineers

User:
  UserID

Group:
  GroupID

Membership: (user is member of a group)
  GroupID
  UserID
  IsScrutineer
  IsPresident
于 2013-07-19T14:10:49.877 に答える