2009-07-22 71 views
3

我正在PHP的社交網絡類型網站工作,我做過這一次,並且網站超過了我的編碼能力以跟上,這是幾年前現在我想再次解決這個項目。用戶操作喜歡社交網絡Facebook,myspace,所有大的

Basicly我的網絡上有一個friend_friend MySQL表持續跟蹤誰是誰的朋友,對於每位確認的朋友,有2項進入DB 這裏是表:

CREATE TABLE IF NOT EXISTS `friend_friend` (
    `autoid` int(11) NOT NULL AUTO_INCREMENT, 
    `userid` int(10) DEFAULT NULL, 
    `friendid` int(10) DEFAULT NULL, 
    `status` enum('1','0','3') NOT NULL DEFAULT '0', 
    `submit_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `alert_message` enum('yes','no') NOT NULL DEFAULT 'yes', 
    PRIMARY KEY (`autoid`), 
    KEY `userid` (`userid`), 
    KEY `friendid` (`friendid`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1657259 ; 

然後我有一個包含所有用戶信息的用戶表稱爲friend_reg_user

然後,用戶發佈公告的表格,該對象僅顯示來自您與之成爲朋友的用戶的公告。 以下是公告表

CREATE TABLE IF NOT EXISTS `friend_bulletin` (

    `auto_id` int(11) NOT NULL AUTO_INCREMENT, 
    `user_id` int(10) NOT NULL DEFAULT '0', 
    `bulletin` text NOT NULL, 
    `subject` varchar(255) NOT NULL DEFAULT '', 
    `color` varchar(6) NOT NULL DEFAULT '000000', 
    `submit_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `status` enum('Active','In Active') NOT NULL DEFAULT 'Active', 
    `spam` enum('0','1') NOT NULL DEFAULT '1', 
    PRIMARY KEY (`auto_id`), 
    KEY `user_id` (`user_id`), 
    KEY `submit_date` (`submit_date`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=455144 ; 

好了,所以要做到這一點我要麼運行在friend_friend表查詢來獲取用戶的所有朋友,並把它們添加到字符串這樣1,2,3,4, 5,6這些將是朋友ID號,然後從公告表中選擇公告作者ID在我的朋友ID列表中

第二種方法是使用JOINS一次獲取所有這些數據。

我現在終於找到了,一旦網站變得非常龐大,當數據庫中有數百萬的朋友記錄和公告時,這一切都會變慢,我有什麼選擇來加快速度?有一個更好的方法嗎?此外,我正在計劃更改公告,以包括更多僅僅是公告,但要做更多的用戶操作,如現在的大網站,以便顯示狀態更新,博客和公告以及所有

回答

2

您正在尋找的事情可能會以多種方式完成。您可以擁有一個彙總彙總表,該表彙總了給定成員的所有關聯數據(本例中爲朋友)。

這是一個非常基本的方法,但它可以變得更加複雜。

彙總彙總充當持久性緩存機制。您必須通過某種方法保持最新​​ - 一個cron作業,MapReduce等。您不希望每次需要時計算所有數據 - 而是定期計算它以便快速準備就緒。

Memcache是​​一個很好的緩存工具,但緩存的數據必須在某個時刻計算。不幸的是,Memcache並不是持久的。這意味着如果memcached服務器或服務死亡,您的數據也會死掉。

您可以探索一些先進的尖端技術,如MongoDB,CouchDB,Project Voldemort和neo4j,以獲得更高效的工具。

標識還建議在尋找基於社交網絡的埃爾格開源PHP源代碼在http://www.elgg.org/

0

Facebook使用memcached將SQL數據庫存儲爲分佈式散列表。這可能是你最好的選擇。

+1

聲音說起來容易,做:-)我 – 2009-07-22 18:15:22