2013-11-26 158 views
1

我有一個數據庫,其中包含使用外鍵來表示它們之間的關係的表。在一個表中,我有2列。 1是id(外鍵),其他包含friendsids(來自朋友表的外鍵)。如何建立數據庫中的一對多關係

要麼我可以把朋友在不同的行:

    | id | friendsids | 
       | 1 | 3   | 
       | 1 | 4   | 
       | 1 | 5   | 

或將它們打包成一個單一的字符串字段:

    | id | friendsids | 
       | 1 | 3,4,5  | 

在第二種方式以後,我會分開使用PHP explode() friendsids。還記得我有很多記錄。哪種方式更有效率,爲什麼?

在此先感謝。

+3

儘可能規範化您的數據庫。所以第一個選擇就是去配合它。如果您使用第二個,則會將聯繫人數據加入到friendsids鍵中。 – TiMESPLiNTER

+0

隨意使用選項#2,但不要在這裏問如何消除由於破壞數據庫實際上在其本身之間進行RELATE數據的能力所造成的損害:http://en.wikipedia.org/wiki/Database_normalization –

+0

萬一如果friendsids不是外鍵,你是否仍然認爲第一個是更好的選擇? – Arvie

回答

2

忘掉PHP中的分割。你在做什麼是一個所謂的映射表,它確實應該是1:1。這讓你

  • 輕鬆插入忽略添加映射的w/o檢查,如果它已經存在,
  • 輕易刪除映射的w/o檢查,如果它已經存在,
  • 容易COUNT(*)朋友的數量,
  • 輕鬆地將數據進行復雜查詢
  • 了一個獨特的指數跨越兩行並在後者
  • 非唯一保存的數字作爲數字而不是字符串節省大量的搜索數據的真快公羊和dis k i/o

並且還可以多得多。

3

數據庫規範化的規則規定,您只在1字段中有1值。這樣你就可以用正確的主鍵訪問任何單個值,而不必做一些難看的代碼來分割返回的字符串。

無論何時設計數據庫,都應該始終遵守規範化規則。 Here是維基百科文章的鏈接。

而如果你忘記了:

鍵,整個鍵並沒有什麼,但關鍵 - 幫幫我吧科德。

+1

鑰匙,整個鑰匙,只有鑰匙 - 所以幫助我Codd。 – CD001

+0

就是這個!如果它在大學期間一直在向我灌輸。 – christopher

0

正如之前所說選項之一是要走的路,不wory有關性能,選項1已在如此衆多的數據庫有效地工作,這麼多年..

只記得正確的索引上做的地方正確的桌子,你很好走。

SQL是用來處理大量數據的