Sosyal ağlar facebook, myspace, tüm büyük olanlar gibi kullanıcı eylemleri

2 Cevap php

PHP bir sosyal ağ tipi sitesinde çalışıyorum, ben daha önce bu yapmış ve site tutmak benim kodlama yeteneğini outgrew, bu bir kaç yıl önce oldu ve şimdi yine bu proje çözmek isteyen duyuyorum.

Basicly on my network there is a friend_friend mysql table that keeps track of who is who's friend, for every confirmed friend, there are 2 entries into the DB here is that table:

    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 ;

Ben daha sonra tüm kullanıcılar bilgileri denilen friend_reg_user ile kullanıcı tablo var

Then a table for bulletins that users post, the object is to only show bulletins from users who you are friends with. Here is bulletins table

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 ;

Tamam, böylece bu yapmak için ben bir kullanıcının tüm arkadaşlar almak ve bu arkadaşı kimlik numaraları olacak bu 1,2,3,4,5,6 gibi bir dize eklemek için friend_friend masada bir sorgu çalıştırmak ve ardından seçmek istiyorsunuz ya bülten tablodan nereden bülten yazar kimliği arkadaşım ID listesindedir

İkinci yöntem kullanmak için bir kerede tüm bu verileri almak için KATILDI.

Site çok büyük olur bir kez arkadaşları kayıtları ve bültenlerin milyonlarca DB varken benim arayışı nihayet, bu tüm yavaşlatır, işleri hızlandırmak için seçeneklerim nelerdir? Bunu yapmak için daha iyi bir yolu var mı? Ayrıca ben o durum güncellemeleri ve bloglar ve bültenlerin göstermek ve tüm böylece sadece bültenlerinde daha sonra bunlarla büyük siteler şimdi yaptığım gibi kullanıcı eylemleri daha fazlasını yapmak için bültenleri değişen planlıyorum

2 Cevap

Ne yapmak isteyen muhtemel çeşitli şekillerde yapılabilir. Belirli bir üyesi için ilgili tüm verileri (bu örnekte arkadaş) birleştiren bir özet toplaması tablo olabilir.

Bu çok temel bir yaklaşımdır ama çok daha gelişmiş olabilir.

Özet toplamaları kalıcı bir önbelleğe alma mekanizması olarak hareket ederler. Bazı yöntemi ile bugüne kadar bu kadar tutmak zorunda olacak - Cron, MapReduce, vb Eğer ihtiyacınız her zaman tüm bu verileri hesaplamak istemiyorum - hızla hazır olması yerine, düzenli aralıklarla hesaplamak.

Memcache önbelleğe ama yine de bir noktada hesaplanan gerektiğini önbelleğe veri için harika bir araçtır. Ne yazık ki, Memcache kalıcı değildir. Bu memcached Servier veya hizmet ölürse, böylece verilerinizi yok demektir.

Bu tür MongoDB, CouchDB, Proje Voldemort ve hatta daha verimli araçlar için neo4j gibi bazı gelişmiş kesme teknolojileri keşfedebilirsiniz.

Id de http://www.elgg.org/ de açık kaynak PHP tabanlı sosyal ağ Elgg için kaynak koduna bakarak tavsiye

Facebook dağıtılmış karma tablo olarak SQL veritabanları saklamak için memcached kullanır. Bu muhtemelen en iyi bahis var.