2010-05-26 129 views
10

存儲用戶關係的最佳方式是什麼?友誼,必須是雙向的(你是我的朋友,因此我是你的朋友)在rel。數據庫,例如MySQL的?在關係數據庫中存儲1:1用戶關係的最佳方式

我能想到的方法有兩種:

  1. 每當用戶朋友的其他用戶,我想補充兩行到數據庫,行A由後面的UID的innitiating用戶的用戶ID下一列中的接受用戶。行B將是相反的。
  2. 您只能添加一行,UID(啓動用戶),後跟UID(接受用戶);然後在試圖弄清用戶1是否是用戶2的朋友時,只需在兩列中進行搜索。

肯定還有更好的嗎?

+0

聽起來像你有設計權。你引用的是兩個表之間的關聯,以便在每個表和關聯表之間創建0..1或更多。最終它所俘虜的是多對多。但我必須說出你的權利,以這種方式處理它。 – 2010-05-26 01:07:02

回答

8

我將有一個鏈接表的朋友,或任何,2列都是PK的,並且都是FK的用戶表。

兩列都是UID,每個朋友關係(A,B和B,A)都有兩行。只要兩列都是PK的,它應該仍然是正常的格式(儘管其他人可以自由糾正我)

它的查詢稍微複雜一點,但沒有任何東西不能被抽象掉存儲過程或一些業務邏輯,它的格式通常很好。

+5

請記住,在MySQL中默認引擎MyISAM不支持外鍵,請切換到InnoDB。 – 2010-05-26 01:15:36

+0

確實如此,但是如果你絕對不得不使用MyISAM,那麼你可以逃避這些不是真正的FK,但它可能會影響你的數據完整性和規範化,堅持使用InnoDB – 2010-05-26 01:27:54

+2

我會使用這個系統以及它大大簡化用於查找朋友的選擇查詢,尤其是當您需要加入這張表時。但是,您應該使用事務和存儲過程來確保兩行總是一起插入和刪除(您不**不希望意外刪除兩行中的一行)。 – 2010-05-26 01:34:19

3

使用雙行,雖然它創建額外的數據,將大大簡化您的查詢,並允許您聰明地索引。我還記得在Twitter的自定義MySQL解決方案中看到的信息,其中他們使用額外的字段(基本上是朋友#)來執行自動限制和分頁。它看起來相當平穩: https://blog.twitter.com/2010/introducing-flockdb

-6

使用關鍵值存儲區,例如Cassandra。

+0

該請求特別針對MySQL解決方案。 – ethanpil 2017-01-27 15:28:26

3

您可以檢查哪兩個user_id是最低的,並按特定順序存儲它們。通過這種方式,您不需要爲兩個友誼重複行,並且仍然保持簡單的查詢。

user_id_low | user_id_high

一個簡單的查詢來檢查,如果你已經在與某人的朋友應該是:

<?php 
$my_id = 2999; 
$friend_id = 500; 

$lowest = min($my_id, $friend_id); 
$highest= max($my_id, $friend_id); 

query("SELECT * FROM friends WHERE user_id_low=$lowest AND user_id_high=$highest"); 
?> 

或者你可以用mysql

<?php 
query("SELECT * FROM friends WHERE user_id_low=LEAST($my_id, $friend_id) AND user_id_high=GREATEST($my_id, $friend_id)"); 
?> 

找到最低/ higest用戶名和獲得所有你的朋友編號爲

<?php 

query("SELECT IF(user_id_low=$my_id,user_id_high,user_id_low) AS friend_id FROM friends WHERE $my_id IN (user_id_low, user_id_high)"); 

?> 
+0

看了半分鐘後,只是覺得我會想出一個很好的理由,爲什麼不應該使用。但是,不,我沒有。這不是一個糟糕的解決方案 - 實際上非常優雅:)實際上,這也支持一個系統,您可以安排一組例如100個朋友組,只需將它們全部放入asc/desc命令 – 2013-12-19 13:04:55