Bir sosyal ağ php / mysql için arkadaş eylemleri almak için en iyi yolu

1 Cevap php

I have a social network similar to myspace but I use PHP and mysql, I have been looking for the best way to show users bulletins posted only fronm themself and from users they are confirmed friends with.

Bu 3 tabloları içerir

friend_friend = this table stores records for who is who's friend friend_bulletins = this stores the bulletins friend_reg_user = this is the main user table with all user data like name and photo url

Ben bülten yayınlayacağız ve arkadaşı tablo şeması altında, sadece kullanıcı tablosu için alanlar önemli yayınlayacağız.

- Tablo için tablo yapısı friend_bulletin

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=245144 ;

- Tablo için tablo yapısı friend_friend

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=2657259 ;

friend_reg_user table fields that will be used auto_id = this is the users ID number disp_name = this is the users name pic_url = this is a thumbnail image path

  • Bültenleri bizim arkadaş listesinde olan bir kullanıcı kimliği ile yayınlanan tüm bültenler göstermelidir
  • Ayrıca biz kendimizi yayınlanan tüm bültenler göstermelidir
  • iyi ölçek gerekiyor, arkadaşlar masa birkaç milyon satır olduğunu

/ / 1 Eski yöntem subselect kullanır

SELECT auto_id, user_id, bulletin, subject, color, fb.submit_date, spam
FROM friend_bulletin AS fb
WHERE (user_id IN (SELECT userid FROM friend_friend WHERE friendid = $MY_ID AND status =1) OR user_id = $MY_ID)
ORDER BY auto_id

// Another old method that I used on accounts that had a small amount of friends because this one uses another query that would return a string of all there friends in this format $str_friend_ids = "1,2,3,4,5,6,7,8"

select auto_id,subject,submit_date,user_id,color,spam
from friend_bulletin
where user_id=$MY_ID or user_id in ($str_friend_ids) 
order by auto_id DESC

Ben bu yüzden KATILDI deneme olmuştur benim site gerçekten büyük oluyor gibi bu performans için iyi değil biliyorum

I beleive this gets everything I need except it needs to be modified to also get bulletins posted by myself, when I add that into the WHERE part it seems to break it and return multiple results for each bulletin posted, I think because it is trying to return results that I am a friedn of and then I try to consider myself a friend and that doesnt work well.

Bütün bu yazı benim ana noktası olsa ben bu görevi yapmak için en iyi performansı yolda görüşlerine açığım, pek çok büyük sosyal ağları sadece arkadaşlarınız tarafından yayınlanmıştır öğelerin bir listesini döndürmek benzer bir işlevi var. Diğer hızlı yol olmalı?? Ben performans için büyük değildir KATILDI okumaya devam ama bu başka nasıl yapabilirim? Ben etrafında hiçbir yolu yoktur indeksleri kullanımı ve özel bir veritabanı sunucusu var ama benim userbase büyük akılda tutmak

SELECT fb.auto_id, fb.user_id, fb.bulletin, fb.subject, fb.color, fb.submit_date, fru.disp_name, fru.pic_url
FROM friend_bulletin AS fb
LEFT JOIN friend_friend AS ff ON fb.user_id = ff.userid
LEFT JOIN friend_reg_user AS fru ON fb.user_id = fru.auto_id
WHERE (
ff.friendid =1
AND ff.status =1
)
LIMIT 0 , 30

1 Cevap

Her şeyden önce, size sadece ihtiyacınız birincil satırlık bir tablo erişiyor böylece veritabanını dışarı bölümlemek için deneyebilirsiniz. Daha az sıklıkta başka bir tabloya kullanılır satırları taşıyın.

Joın performansını etkileyebilir ama ben ne gördüm, subqueries daha iyi değildir. Eğer bir kerede tüm bu verileri çekerek değil böylece sorgu üstlenmeden deneyin. Bu sorgunun bazı zamanlar başka app çalıştırmak olabilir gibi de görünüyor, ve bu sonuçlar değişkenler saklanan veya önbelleğe ya.

Örneğin, her kullanıcı için bağlı arkadaşlar bir dizi önbelleğe ve sadece referans olduğunu sorguyu çalıştıran ve yeni arkadaş eklendi / kaldırıldı zaman sadece önbelleği güncelleştirme.

Lütfen şişe nneck tamamen db olmayabilir - aynı zamanda sistemleri ve kod mimari yapısına bağlıdır.