PHP / MySQL bir arkadaÅŸÄ?

5 Cevap php

Ben sormadan önce araştırdım Tamam, buldum tüm bu yüzden belki bilen birisi bu göreceksiniz ya da ben onu bir daha net bir soru yapacak ne ben değilim ama 0 cevapları soran birkaç soru oldu.

Ben myspace / facebook benzeri bir sosyal ağ var. Benim kod, bir kişinin arkadaşı ya da değil bir arkadaş ya vardır, bu yüzden (bu yazı ben daha kolay görselleştirmek yapmak için tek başına bulletin mesaj gibi eylemlere sevk edecektir ile arkadaş insanların tüm eylemleri göstermek.

Bir kişi bir bülten yayınlamak her zaman Yani arkadaşım orada herhangi bir kişi kadar gösterecektir.

Yani mysql Eğer, böyle bir şey yaparak bir kişi arkadaş listesi almak istiyorum

SELECT user_id FROM friends WHERE friend_id = 1 (user ID)

I want to know how a site like facebook and some others would show all bulletin post from your friends and from your friends' friends?

Herkesin bir fikri varsa mysql sorgu ne tür gibi bazı kod göstermek lütfen?

5 Cevap

Cevabı, onlar büyük olasılıkla bir de-normalize haber-olay tablosunu kullanarak bir arkadaşım masada seçer yapmıyor olmasıdır. Biz DoInk.com üzerinde Facebook'lar benzer bir haber-besleme, burada biz bunu nasıl bulunuyor uygulanmaktadır:

Bu bir tür, bir başlatıcı (kullanıcı kimliği) ve bir hedef kullanıcı (kullanıcı kimliği) bir "NewsEvent" kavramı vardır. (Ayrıca, olay ile ilgili diğer özellikler için ek bir sütun (ler) var ya onlara katılabilirsiniz)

Başka kullanıcılara bir kullanıcı Mesajları şey duvara ne zaman böyle bir olay oluşturmak:

INSERT INTO events VALUES (wall_post_event, user1, user1)

Kullanıcı1'in profilini görüntülerken, user1 başlatıcı ya da hedef ya da tüm olaylar için seçmek istiyorum. Yani profil besleme görüntülemek nasıl. (Sen fantezi olsun ve gizlilik modeline bağlı olayları filtre edebilirsiniz. Siz performans nedenleriyle bellekte bu yaptığını düşünebilirsiniz)

Örnek:

SELECT * FROM events WHERE initiator = user1 or target = user1 //to see their profile feed

SELECT * FROM events WHERE initiator IN (your set of friend ids) //to see your newsfeed

Arkadaşlarınıza göre tüm olaylar için newsfeed görmek istediğinizde başlatıcı arkadaş kümesindeki tüm olaylar için bir sorgu seçerek yapabilir.

Karmaşıklığına bağlı olarak, alt-seçer ile uygulamaları önlemek, onlar ölçek olmaz.

Eğer bir alt sorgu yapın:

SELECT DISTINCT user_id FROM friends WHERE friend_id IN (SELECT user_id FROM friends WHERE friend_id = 1)

Performans için bu her iki test:

SELECT DISTINCT user_id
FROM friends f1
JOIN friends f2 ON f1.friend_id = f2.user_id
WHERE f2.friend_id = 1

ve

SELECT DISTINCT user_id
FROM friends
WHERE friend_id IN (SELECT user_id FROM friends WHERE friend_id = 1)

Genellikle aynı konum ama bazen onlar değiliz.

Make sure friend_id ve user_id are indexed.

Basit bir yaklaşım, basit iç içe maddesinin çeşit yapmak olacaktır. Yani mesaj içeren bir tablo ve posterler kimliği ve bir arkadaş tablo var ki, birinci tabaka olacak

SELECT post FROM posts JOIN friends 
  on post.userid = friends.friend_id 
  WHERE friend.id = 1 (user ID)

o arkadaşlar bir arkadaş almak için

SELECT post FROM posts JOIN
   (SELECT DISTINCT friends_2.friend_id FROM friends AS friends_1 
        JOIN friends as friends_2 
        on friends_1.friend_id = friends_2.id where friends_1.id = 1) 
AS friends 
wHERE post.userid = friends.friend_id AND mainid = 1 (user ID)

Bu Yerleştirme Dost soyutlama başka bir katman eklemek istediğiniz her zaman tekrarlayabilirsiniz. Bu yaklaşımla sorun yürütmek için çok uzun bir zaman alacağını olduğunu. Eğer arkadaşım soyutlama katmanı eklemek her zaman için n (n sizin tablodaki satırların sayıdır) bir güç tarafından karmaşıklığı artmaktadır.

Onlar bir yerde bir tablo görüntülenebilir arkadaşlar tasarrufu olduğunu daha olasıdır, bu nedenle yeni bir masaya çağırdı friends_web yapmanıza olanak sağlar

user_id, friend_id, level

Bir kullanıcı arkadaşlar birisi, bir 0 düzeyinde friends_web yeni arkadaş (o arkadaşına beri uzak hayır insanlar) olduğunu ekler o zaman ekler (ötede 1 arkadaşına beri) 1 seviyesinde arkadaş arkadaş. Tablo bütünlüğünü korumak için ayrıca ters kayıt eklemek isterim. Bir arkadaş olarak ekler B ve C B bir arkadaşı olup olmadığını açıklığa kavuşturmak için, aşağıdaki iki kayıtlar yeni tabloya eklenir alacağı

A, C, 1
C, A, 1

şimdi bu yana A, C ve C A'ya görebilirsiniz görebilirsiniz

şimdi biz sadece bunu bir sorgu istediğinizde

 SELECT post FROM posts 
  JOIN friends_web ON post.user_id = friends_web.friend_id 
  WHERE friends_web.user_id = user_id AND friends_web.level < 2 (or however deep you want to look)

Derin bir arkadaş web içine daha sonra 1 tabaka bakmak mümkün olurken sonrası aramalarını yaparken sorgu karmaşıklığı en aza yaparak.

Uzun soluklu bir yanıt için özür dilerim.

Bu kullanıcının tüm arkadaşının Mesajları çekin gerekir.

SELECT * FROM posts WHERE uid IN (SELECT friend_uid FROM friends WHERE uid=1) ORDER BY post_id DESC

Bu arkadaşınızın arkadaşınızın tüm mesajlarını çekin gerekir.

SELECT * FROM posts WHERE uid IN (SELECT friend_uid FROM friends WHERE uid IN (SELECT friend_uid FROM friends WHERE uid=1)) ORDER BY post_id DESC