3

私は PHP でソーシャル ネットワーク タイプのサイトに取り組んでいます。以前にこれを行ったことがありますが、サイトは私のコーディング能力を超えて成長しました。これは数年前のことで、今はこのプロジェクトにもう一度取り組みたいと思っています。

基本的に、私のネットワークには、誰が誰の友達であるかを追跡する friend_friend mysql テーブルがあります。確認されたすべての友達に対して、DB に 2 つのエントリがあります。このテーブルは次のとおりです。

    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 リストにある掲示板テーブルから

2 番目の方法は、JOINS を使用して、このすべてのデータを一度に取得することです。

最終的に私の探求は、サイトが非常に大きくなると、データベースに何百万もの友人の記録と速報があるとき、これはすべて遅くなります.物事をスピードアップするための私のオプションは何ですか? これを行うより良い方法はありますか?また、速報だけでなく、より多くのユーザー アクションを含むように速報を変更することを計画しています。

4

2 に答える 2

2

あなたがしようとしていることは、多くの方法で実行できる可能性があります。特定のメンバーに関連付けられたすべてのデータ (この例ではフレンド) を組み合わせた要約ロールアップ テーブルを作成できます。

これはかなり基本的なアプローチですが、より洗練されたものになる可能性があります。

サマリー ロールアップは、永続的なキャッシュ メカニズムとして機能します。cron ジョブ、MapReduce などの何らかの方法でこれを最新の状態に保つ必要があります。データが必要になるたびにすべてのデータを計算するのではなく、定期的に計算してすぐに準備できるようにします。

Memcache はキャッシング用の優れたツールですが、何らかの時点で計算する必要があるデータをキャッシュします。残念ながら、Memcache は永続的ではありません。つまり、memcached のサーバーまたはサービスが停止すると、データも停止します。

さらに効率的なツールについては、MongoDB、CouchDB、Project Voldemort、neo4j などの高度な最先端技術を探索できます。

また、オープン ソースの PHP ベースのソーシャル ネットワーク Elgg のソース コード ( http://www.elgg.org/ ) も参照することをお勧めします。

于 2009-07-22T20:13:14.753 に答える
0

Facebook は memcached を使用して、SQL データベースを分散ハッシュ テーブルとして格納します。それがおそらくあなたの最善の策です。

于 2009-07-22T18:13:54.057 に答える