1

異なるユーザーがいて、各ユーザーがカテゴリに分類される友達のセットを持つアプリケーションを作成したいと思います。デフォルトのカテゴリがいくつかありますが、ユーザーは独自のカテゴリを追加できます。私はこれを行うための最良の方法はどれになるのだろうかと思っていました。

私の考えは、ユーザー、友達、カテゴリの3つのテーブルを持つことです。

友達とカテゴリのフィールド(1対多)を持つユーザーテーブル(ただし、ユーザーテーブルに友達とカテゴリに関する情報が必要かどうかはわかりません)。

フレンドテーブルには、カテゴリ用のフィールド(1対多)とユーザー用のフィールド(多対1)があります。

ユーザー(多対多?)および友人(多対多?)のフィールドを持つカテゴリーテーブル。

関係もよくわかりません。私はMySQLとSymfony2とDoctrine2でPHPを使用しています。助けてください!


編集

たぶん私は私が必要なものを正確に説明していません。アプリを開くと、ログインフォームが表示されます。アカウントをお持ちでない場合は、登録する必要があります。登録すると、新しいユーザーが作成されます。このユーザーは他のユーザーとは関係がありません(私はまだプログラミングに不慣れで、もう少し簡単なものが欲しいので、電話帳のようなものです)。各ユーザーには友達のリストがあり、firendは、名前、住所、電話、電子メール、写真、誕生日などのフィールドを持つテーブルの行ですが、現在のユーザーによって追加されます。友達はユーザーではありません。実際、すべてのユーザーはパスワードとユーザー名を持つアカウントであり、ログインすると友達のリストだけが表示されます。したがって、各ユーザーは自分用のカテゴリを作成し、他のユーザーやそのカテゴリとは何の関係もありません。カテゴリにはIDと名前のみが含まれます。

つまり、アカウントを作成し、いくつかのカテゴリを作成して友達を追加し、友達が生まれたときや住んでいる場所、または電話番号を主催者にするだけですが、アカウントを作成して、それらは、ユーザー自身に対するものです。それはソーシャルネットワークのようなものではありません。各ユーザーが友達に関する情報を書くことができる単なるノートブック。

4

2 に答える 2

1

このために次のテーブルセットを提案できます(このスキームは電話帳やソーシャルネットワークのタスクにも適用されます)。

ユーザーに関するすべての情報を格納するテーブル「ユーザー」:

  • ユーザーID
  • 名前
  • 電話
  • 住所
  • ...(その他のフィールド)

関係カテゴリに関する情報を格納するテーブル「カテゴリ」:

  • CategoryId
  • 名前

ユーザー間の関係に関する情報を格納するテーブル「関係」:

  • FirstUserId->ユーザーテーブルへのリンク
  • SecondUserId->ユーザーテーブルへのリンク
  • CategoryId->カテゴリテーブルへのリンク

したがって、どのユーザーも新しいカテゴリを追加し、別の人に新しい関係を追加するときにそれらを参照することができます。

すべてのユーザーの友達を選択する必要がある場合は、次のことを行う必要があります。

select fr.* from Relationships r join Users fr on r.SecondUserId = fr.UserId where r.FirstUserId = <Current user id>
于 2012-08-27T14:41:48.597 に答える
1

まず、交差テーブルの役割を理解する必要があります。ユーザーAがユーザーBを友達としてラベル付けし(つまり、userそれ自体から多対多の関係がある場合)、その関係を表す新しいテーブルを作成します(friends表)、この「友情」に関する追加情報は、その表にリンクする必要があります。したがって、ユーザーが何らかの方法で友達を分類した場合、そのカテゴリはに適用されますが、には適用されfriendsませんuserこの特定の目的のためcategoryにとの間の関係は必要ありません。user

更新:友達はユーザーではないため、friendsテーブルは交差テーブルにはなりません(したがってuser、「所有者」を示す、への参照は1つだけです)が、残りの回答は引き続き適用されます。

各カテゴリがテーブルの行になると想定していcategoryます。カテゴリに関する追加情報が追加される場合がありますが、それに限定する必要があります。たとえば、どのユーザーがカテゴリを作成したかを知りたい場合は、user「owner」や「created_by」などのラベルに外部キーを追加できます。これは、あるユーザーが作成したカテゴリが他のユーザーに表示されない場合に役立つことがあります。

friends最後に、と関連付けることができますcategory。ユーザーAがユーザーBを最大で1つのカテゴリに入れることができる場合、からfriendsへの外部キーcategoryで十分です(つまり、1対多の関係)。そうしないと、別の多対多の関係が必要になる可能性があるため、追加の交差テーブルを作成する必要があります(たとえばfriend_category)。

非正規化friendsを使用して、両方のユーザーが同じ(および同じ順序)であるがカテゴリが異なる複数の行を使用することで、この余分なテーブルを回避できます(この例も参照)。これが有利かどうかはこの回答の範囲を超えていますが、今のところ、追加のテーブルを使用するIMHOの方が適しています(より複雑に見えるかもしれませんが、長期的には保守が容易になります)。(更新:が交差テーブルでない場合friends、このように非正規化することは実際にはオプションではないため、friend_categoryテーブルに固執します)

最終的に、レイアウトは次のようになります。

user              friends           friend_category   category
----              -------           ---------------   --------
(user fields) <-- user (owner)    <--  friend         (category fields)
                  (friend fields)      category   --> user (owner) --+
^                                                                    |
|                                                                    |
+--------------------------------------------------------------------+
于 2012-08-24T20:10:01.870 に答える