6


3

Facebookが「相互の友人」機能をどのように行うのか疑問に思う

私は現在、学生がコースを管理できるようにするアプリケーションを開発していますが、特定の機能のためにデータベースを設計する方法はよくわかりません。 クライアントは、Facebookのように、学生が現在特定のコースに参加している人のリストを表示するときに、ログインしているユーザーと最も相互のコースを持つ人が最初に表示されることを望みます。 Facebookの「友達の提案」機能と追加のフィルターがほぼ同じです。

追加機能として、検索機能を追加して、学生が別の機能を検索できるようにし、検索結果の最初に、ログインしているユーザーと最も共通のコースを持つ人々を表示したいと思います。

現在MySQLを使用していますが、他の機能にはCassandraを使用する予定です。また、結果のキャッシュにはMemcachedを使用し、検索にはSphinxを使用します。

ありがとう。

 — --

このアプリはPython、BTWで開発されています

また、標準的なアプローチ(すてきなMySQLクエリを使用してORDER BY句を使用してこれをすべて計算する)が非常に遅いことを言及するのを忘れました。 したがって、読み取りは読み取りよりもはるかに頻繁に行われるため、関係の人の<→コースが追加されたときに、ほとんどのロジックを一度実行してください。

ログインしたユーザーが新しいコースに参加すると、コースのすべてのユーザーに対して増加する(または退会すると減少する)1つのタプル(ユーザー、コース)に固有の「相互コース」カウンターを更新することを考えました。

3 Answer


4


「Users」という名前のテーブルがあり、主キーが「UserID」であるとします。 次に、「UserID」(PK)と「FriendUserID」という2つの列を持つ「Friends」というテーブルがあります。

20人と50人の2人のユーザーがいるとします。

20が友人として50を追加すると、アプリケーションは新しい行を追加します。

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

50が友情を確認したら、値を切り替えて別の行を追加します。

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

20〜50歳の共通の友達を探したいときは、次のようにします。

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


4


既に解決策を持っているが、問題がそのクエリの速度だけである場合は、より早くそれを試してください。 ユーザーの友情が変わったら、これらのことを計算してすべての結果を保存するジョブを再実行します。 すぐに結果が必要な場合は、リクエストの結果として彼を実行しないでください。 そのような高価なことを一度だけ行い、要求が行われる前にそれらを行います。


0


私はこれを(2)クエリとして分割し、Pythonで交差点を見つけます:

#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'

次に、Pythonで交差点を見つけます。 その後、データベースにキャッシングなどを行わせることができます…​ 速度を落とすための結合なし。