PHP / MySQL Aktivite (facebook ala)

2 Cevap php

Bu tüylü bir soru olabilir ama. Ben Say

Followers:
-user_id
-follower_id

Activities:
-id
-user_id
-activity_type
-node_id

Bir kullanıcıları faaliyet çekme oldukça kolaydır. Ama takipçileri aktivite almak için en iyi yolu nedir? Bir subselect? Kullanıcılarının daha takipçileri almak gibi inanılmaz yavaş gibi görünüyor. Bu hızlandırmak için herhangi bir fikir?

Ayrıca, daha kavramsal düzeyde. Nasıl gruplama işliyor. Hepsi tek bir sorgu ile yapılır? Ya da tüm faaliyet verileri çekti ve ardından sıralanmış ve PHP tarafında gruplandırılmış?

Users X, Y and Z did Activity A User J did 3 of Activity B

2 Cevap

Subselects sık Joın daha yavaş, ama gerçekten onlarla yaptığınızı tam olarak bağlıdır. Size ana soruyu cevaplamak için, ben bir JOIN ile takipçisi veri almak istiyorum:

SELECT * FROM followers f
LEFT JOIN activities a ON f.follower_id=a.user_id
WHERE f.user_id=$followedPerson

Bu takipçileri tablo user_id ile bir kullanıcıyı temsil ettiğini varsayarak, ve olan bir follower_id olarak kullanıcıların tablodaki bir user_id olur ki onları takip birisi iyi.

Bu, şimdiye kadar incredibly sürece followers.user_id bir dizin gibi yavaş olmayacaktır. Ancak, böyle bir sorgu geri dönebilirler veri miktarı gerçekten uğraşmak isteyen daha büyük hale gelebilir. Eğer başvuru göstermek istiyorum gidiyor aktivite ne tür belirlemek ve size büyük sorguları her zaman yapmıyor ama sadece döndürülen sonuçların küçük bir kısmını kullanarak değil ki buna göre filtrelemek için denemek gerekir.

Dışarı veri çekerek ve bunu PHP tarafı gruplandırma gayet iyi, ama ilk etapta bunu seçerek önleyebilirsiniz eğer, sen daha iyisin. Bu durumda, muhtemelen bir tarih var varsayarak, bir ORDER BY f.follower_id,activity_date DESC ekleyebilir ve etkinlik tablo için biraz daha fazla filtreleme kriterleri ile gelip denemek istiyorsunuz. Sonra takipçisi göre gruplandırılmış veri çıkışının PHP satırları arasında yineleme olur.

Bir etkinlik günlüğü genellikle geçerli kullanıcının aktivite ve tüm arkadaşlar bir karışımına sahiptir beri kayıtların çok sayıda potansiyele sahiptir. Çeşitli tablolar katılıyor ve bir kullanıcı arkadaşlar 100'ler varsa o potansiyel bilgileri çekilirken bir sürü.

Bir yaklaşım verileri denormalise ve bir kullanıcının aktivite günlük sayfada görünmesi gereken tüm kayıtlar bu kullanıcıya karşı aktivite günlük tablosunda saklanabilir için büyük bir günlüğüne gibi tedavi etmektir. Örneğin A kullanıcısının üç etkinlik günlüğü kayıtları oluşturulur bir şey yok, iki arkadaş, Kullanıcı B ve C Kullanıcı, varsa:

record 1: "I did this" log for user A
record 2: "My friend did this" log for user B
record 3: "My friend did this" log for user C

Sen çiftleri alırsınız, ama bu gerçekten önemli değil. Bu bir tablodan bulunuyor ve sadece kullanıcı kimliği endeksli beri seçmek için hızlı. Ve bir etkinlik günlüğü tablosunu (yani 1 ay içinde eski girdilerini silmek) housekeep olacak büyük olasılıkla.

Etkinlik günlüğü tablo gibi bir şey olabilir:

-id
-user_id  (user who's activity log this is)
-action_user_id  (user who took the action, or null if same as user_id)
-activity_type
-date

Tek bir kullanıcı için son etkinlik günlükleri öğesini seçmek için kolaydır:

SELECT * from activity_log WHERE user_id = ? ORDER by date DESC LIMIT 0,50

Bu yaklaşım gerçekten verimli hale getirmek için, başka seçer gerekmez için tek etkinlik günlüğü tabloda yeterli bilgiye sahip olması gerekir. Örneğin ham günlük mesaj saklayabilir, yerine anında inşa.