2012-08-22 69 views
1

我想做一個應用程序,其中將有不同的用戶,每個用戶將有一組朋友將被放入類別。會有一些默認的類別,但用戶將能夠添加他自己的。我想知道哪種做法是最好的。哪些是關聯一些表的最佳方式?

我的想法是有3個表格 - 用戶,朋友和類別。

用戶表具有朋友和類別的字段(一對多)(但我不知道用戶表是否需要關於朋友和類別的任何信息)。

朋友表有一個類別(一對多)字段和用戶字段(多對一)的字段。

類別表具有用戶(多對多?)和朋友(多對多?)的字段。

我也不確定關係。我使用PHP和MySQL以及Symfony2和Doctrine2。請幫忙!


編輯

也許我還沒有正是我需要的描述。當你打開應用程序時,你會看到一個登錄表單。如果你沒有賬戶,你應該註冊 - 註冊會創建一個新用戶。這個用戶沒有與其他用戶連接(我仍然是編程新手,我想要更容易些,所以它就像電話簿一樣)。每個用戶都有一個朋友列表,而firend是表格中的一行,包含姓名,地址,電話,電子郵件,照片,生日等字段,但是它們是由當前用戶添加的。朋友不是用戶。每個用戶實際上都是一個擁有密碼和用戶名的帳戶,當你登錄時只有一個朋友列表。因此,每個用戶都爲自己創建類別,而且與其他用戶及其類別無關。該類別將只有ID和名稱。

所以這個想法是,你創建一個帳戶,然後創建一些類別和添加朋友給他們只是爲了有一個組織者,當你的朋友出生或住在哪裏,或者他們的電話號碼,但你創建它們和添加關於他們的信息,他們是用戶自己。這不像一個社交網絡。只需一個筆記本,每個用戶都可以寫出關於他朋友的信息。

+0

是「朋友」其他「用戶」呢?或者,出現在「朋友」中的人不是出現在「用戶」中的人? – golmschenk

+0

這位朋友不是用戶。每個用戶實際上都是一個擁有密碼和用戶名的帳戶,當你登錄時只有一個朋友列表。朋友是名字,電話,地址和那類事物的組合,但不是用戶本身。 – Faery

回答

1

首先,您需要了解intersection tables的作用:如果用戶A將用戶B標記爲朋友(即存在從user到自身的多對多關係),並且您創建一個新表以代表那種關係(friends表),關於這種「友誼」的任何附加信息應該與該表相關聯。因此,如果用戶以某種方式將朋友分類,則該類別適用於friends,而不適用於user。對於此特定目的,categoryuser之間不需要關係

更新:因爲朋友都不用戶,friends表將不會是一個交集表(因此只有一個參考回到user,表示「所有者」),但答案的其餘部分仍然適用。

我假設每個類別將是category表中的一行。有關類別的其他信息可能會添加,但它應該僅限於此。例如,如果您想知道哪個用戶創建了一個類別,那麼可以將一個外鍵添加到標記爲「owner」或「created_by」的user。如果一個用戶創建的類別不被別人看到,那麼這可能會很有用。

最後,您可以將friendscategory聯繫起來。如果用戶A可以將用戶B置於最多一個類別中,則從friendscategory的外鍵應該就足夠了(即,一對多關係)。否則,您可能需要另一個多對多關係,因此應創建一個附加的交點表(例如friend_category)。

您可以通過使用denormalization避免額外的表,在friends具有多行,其中兩個用戶都是相同的(並以相同的順序),但種類是不同的(另見this example)。這是否有利是超出了這個答案的範圍,但恕我直言,使用額外的表格現在更好(它可能看起來更復雜,但從長遠來看將更容易維護)。 (更新:如果friends不是一個交集表,非規範化像這樣的是不是一個真正的選擇,所以用friend_category表貼)

最後,你的佈局應該是這樣的:

user    friends   friend_category category 
----    -------   --------------- -------- 
(user fields) <-- user (owner) <-- friend   (category fields) 
        (friend fields)  category --> user (owner) --+ 
^                 | 
|                 | 
+--------------------------------------------------------------------+ 
+0

謝謝你的回答!但也許我沒有描述我需要的東西。你能看看編輯嗎?非常感謝您提前! – Faery

+0

我更新了答案。唯一改變的是,'friends'表現在擁有自己的字段(名字,地址,電話等),而不是對'user'的第二個引用,但其餘設計可以按原樣使用。我還在(類別)中添加了(在圖中)「類別」中的「用戶」(所有者)字段,因爲您在更新中說每個用戶都創建了他/她自己的類別,而不是共享。 – mgibsonbr

1

我可以建議如下表此設置(此方案適用於電話簿或社交網絡的任務也一樣):存儲所有關於用戶的信息

表「用戶」:

  • 用戶ID
  • 名稱
  • 電話
  • 地址
  • ...(任何其它領域)

表 「類別」 存儲有關關係類別的信息:

  • 類別ID
  • 名稱

表 「關係」,用於存儲有關用戶之間關係的信息:

  • FirstUserId -
  • SecondUserId>鏈接到用戶表 - >鏈接至用戶表
  • 的CategoryId - >鏈接分類表

因此,任何用戶都可以添加新類別,然後在添加新關係時引用它們發貨給另一個人。

如果您需要選擇所有用戶的朋友,你必須:

select fr.* from Relationships r join Users fr on r.SecondUserId = fr.UserId where r.FirstUserId = <Current user id> 
相關問題