2010-10-31 65 views
0

目前我正在設計一個小的twitter/facebook類系統,在這裏用戶應該能夠看到他的朋友的最新活動。數據庫設計 - 朋友活動

我使用的ASP.NET與MySQL數據庫。

我的友誼表如下:

| Friendshipid |朋友1 | FRIEND2 |確認|

上表中的Friend1和Friend2是用戶標識。

用戶活動表設計如下:

| activityId |用戶ID |活動|日期爲|

現在,我正在尋找最好的方式來查詢用戶的最新50個朋友活動。

例如,假設Tom登錄到系統中,他應該能夠在他的所有朋友中看到最近的50個活動。

任何關於最佳實踐,查詢或任何信息的指針都會被讚賞。

回答

1

如果您有數據庫性能問題,您可以重新定義友誼表如下:

friendshipid, userid, friendid, confirmed

當您查詢最新50個活動,則SQL將是:

SELECT act.* 
FROM Activities AS act 
    INNER JOIN 
    Friendships AS fs 
    ON fs.friendid = act.userid 
     AND fs.user_id = 'logon_user_id' 
     AND confirmed = TRUE 
ORDER BY act.dated DESC 
LIMIT 50; 

如果在友誼(userid)列上有索引,則會爲數據庫提供優化查詢的機會。

重新定義的友誼表需要在友情發生時創建兩個元組,但它仍然遵守商業規則,並且在需要時具有性能優勢。

+0

最後我得到這個工作對我來說:SELECT DISTINCT act.activityId,act.activity,act.dated FROM活動行爲 INNER JOIN 友誼FS WHERE(fs.friend1 = act.userid或fs.friend2 = act.userid)AND(fs.friend1 = 1 OR fs.friend2 = 1)AND act.userid!= 1 AND fs.confirmed = TRUE ORDER BY act.dated DESC LIMIT 50; – Chaitanya 2010-11-14 14:01:53

2

它很大程度上取決於什麼數據存儲在友誼表中。例如,Friend1和Friend2字段存儲的順序是什麼?如果對於字段(friend1,friend2)元組(1,2)存在,則(2,1)是否也存在?

如果不是這種情況,那麼這應該工作:

SELECT activities.* 
FROM Activities 
    INNER JOIN Friendships ON userid = friend1 OR userid = friend2 
WHERE activity.userid != [my own id] 
    AND confirmed = TRUE 
LIMIT 50;