2010-03-29 26 views
6

Şu anda öğrencilerin derslerini yönetmelerine izin vermek için bir uygulama geliştiriyorum ve özellikle belirli bir özellik için veritabanını nasıl tasarlayacağımı bilmiyorum. Müşteri, Facebook'a çok benziyor, bir öğrenci şu anda belirli bir kursta olan kişilerin listesini görüntülediğinde, giriş yapmış olan kullanıcıyla en fazla karşılıklı dersleri olan insanlar önce görüntülenir. Facebook ile hemen hemen aynı ek bir filtre ile "Arkadaş önerileri" özelliği.Facebook'un "Karşılıklı arkadaşlar" özelliğini nasıl kullandığını merak etme

Ek bir özellik olarak, öğrencilerin bir başkasını aramasına ve arama sonuçlarında ilk defa oturum açmış kullanıcıyla en çok karşılıklı dersleri olan kişilerin görüntülenmesi için bir arama özelliği eklemek istiyorum.

Şu anda MySQL kullanıyorum, Cassandra'yı başka özellikler için kullanmayı planlıyorum ve ayrıca arama için sonuç önbelleği ve Sfenks için Memcached kullanıyorum.

Teşekkürler.

-

uygulama wayyyys çok olduğu

BTW, Python geliştirilen Ve standart yaklaşım (güzel MySQL sorgu kullanarak ORDER BY ile tüm bu hesaplamak için) belirtmeyi unutmuşum edilir yavaş. Okumalar okunduğundan çok daha sık olduğu için, mantığın birçoğunun bir kez, insanların < -> dersi eklendiği zaman gerçekleşmesini istiyorum.

Oturum açmış bir kullanıcı yeni bir kursa katıldıklarında (ya da ayrıldığında azaldığında), bir kursun tüm kullanıcıları için artırılacak bir tuple (kullanıcı, kurs) özgü bir "karşılıklı dersler" sayacının güncellenmesini düşündüm .

+0

En çok karşılıklı arkadaşlara sahip insanlar hakkında ne kastediyorsunuz?Şu anda giriş yapmış olan kişi ile aynı arkadaşları olan başka bir kullanıcı bulmak mı istiyorsunuz? Ayrıca hangi dilde gelişmekte olduğunuzu da söylemeniz gerekecek. Web tabanlı şeyler gibi görünüyor, ama mySQL bağımsız uygulamalar için kullanılabilir. Ve hala PHP/ASP/JS veya başka bir dil olup olmadığını bilmemiz gerekiyor. – thecoshman

+0

Evet, beni doğru anladın. Uygulama Python'da geliştirildi, ancak gerçekten, başka bir dil ile aynı kesin sorunla karşı karşıya kalırdım. İnsanların bana kodla yardım etmesini beklemiyorum, ama yapısal fikirlerle :) – Pierre

+0

"Karşılıklı arkadaşların" uygulanması, "en karşılıklı dersler" özelliğinin uygulanmasından biraz farklı olacaktır. Birincisi sadece bir tür varlık (kişi) ve bir ilişki "arkadaşıyla" 'ya ihtiyaç duyar. Sonuncusu iki öğrenci (öğrenci, ders) ve öğrenci ile ders arasındaki ilişkinin, öğrenciler arasındaki ilişkilerin tahmin edilmesinin gerekli olacağıdır. –

cevap

4

Çözümünüzü zaten aldıysanız, ancak sorun yalnızca bu sorgunun hızıdır, daha önce yapmayı deneyin. Bir kullanıcının arkadaşlığı değiştiğinde, bu şeyleri hesaplayan ve tüm sonuçları saklayan bir işi yeniden çalıştırın. Bu sonuca çok hızlı bir şekilde ihtiyaç duyduğunuzda, bir isteğin sonucu olarak onunla uğraşmayın. Bu tür pahalı şeyleri sadece bir kez yapın ve bir istek yapılmadan önce bunları yapın.

+0

Yeni bir ilişki eklendiğinde, düşündüğüm şeyi yapın: Kursta zaten olan her kullanıcı için karşılıklı ilişkilerde (Cassandra'da) bir sayaç güncelleştirin. Sonuçları görüntülerken, sadece Cassandra'dan veri alın, sonuçları geldiği gibi görüntüleyin (önceden sipariş verin) ve diğer kullanıcıları (ilişki olmadan) görüntüleyin ... - Tek endişem hala performans olacaktır. Binlerce insanla bir kursa katılırken büyük bir yük olmaz mıydı? – Pierre

+0

"x için y: updatesql (newvalue)" veya "UPDATE counter = counter + 1 where ..." komutuna sahip olursunuz. Birincisi ağ yüküne çarpacak. İkincisi oldukça hızlı olmalı. –

+0

Yep. SQL'de yapılmışsa tamamen size katılıyorum. Ancak performans sorunu hala (biraz) canlıdır. Eğer içinde 100.000 kişi ile bir ders hakkında konuşursam (evet, var!), Sorguyu kullanamazsınız. == r.user_id_2) r.mutual_counter LİMİT BY SİPARİŞ ... biraz pahalı mı? Cassandra'yı kullanırsam, önceden sipariş edilmiş verileri depolayabilirim.Fakat bildiğim kadarıyla, bu ilişkiyi manuel olarak çözmem gerekiyor:/ – Pierre

4

Users adlı bir tablonuz olduğunu ve Birincil Anahtarın UserID olduğunu varsayalım. Ardından, UserID (PK) ve FriendUserID adında 2 sütun içeren Friends adlı bir tablonuz var. 50 dostluğu onayladığında, sen başka satır eklemek

INSERT INTO `Friends` (`UserID`, `FriendUserID`) VALUES (20, 50) 

ve:

20 Arkadaş olarak 50 ekler zaman 2 kullanıcıları, 20 ve 50

var ki, uygulama yeni bir satır ekler değerler anahtarlamalı:

INSERT INTO `Friends` (`UserID`, `FriendUserID`) VALUES (50, 20) 

basitçe, 20 ve 50 arasındaki karşılıklı arkadaş bulmak istediğinizde:

SELECT `UserID` FROM `Friends` AS `A`, `Friends` AS B WHERE `A`.`FriendUserID` = 20 AND `A`.`UserID` = `B`.`UserID` AND `B`.`FriendUserID` = 50 
+0

Oh, teşekkürler. Bu işe yarıyor. Ancak performans sorunları için kesinlikle geçerli bir çözüm değil. Sonuçları hesaplamak ve saklamak için yeni bir ilişki kurulduğunda bu talep yapılsa bile, bu oldukça büyük bir tablo ile çok yavaş olabilir. – Pierre

+0

Bu iyi görünüyor, ama neden karşılıklı arkadaş bulup bunları başka bir masada saklamıyorsunuz, böylece hesaplamaları tekrar tekrar yapmak zorunda değilsiniz, bunun yerine kullanıcı yeni bir bağlantı kurduğunda karşılıklı arkadaşlarınızı güncelleyecek bir işi çalıştırmanız yeterli. – Magesh

0

I (2) sorguları gibi bu parçalamak ve Python kesişim bulur:

#Query 1 - Get the user's friends 
SELECT friend_id FROM friends WHERE user_id = 'my user id' 

#Query 2 - Get the users enrolled in the course 
SELECT student_id FROM course_enrollment WHERE course_id = 'course id' 

Sonra Python kesişim bulabilirsiniz. Daha sonra veritabanının önbelleğe alınmasını vb.

İlgili konular