0

私はソーシャルネットワークのウェブサイトプロジェクトに取り組んでいます。データベースとすべてを作成しました。投稿テーブルには、preference投稿がユーザーから取得した高評価とコメント、および投稿が作成された時間に応じて、好みの値を格納する列があります。posts テーブルからユーザーのホームページの投稿を取得するために、preferencecolumn を使用して並べ替える結合を使用してクエリを実行しています。ここで、投稿テーブルに表示されるユーザーの 10 件の投稿を取得し、ユーザーが下にスクロールして、次の 10 件の投稿をサーバーに取得するようにユーザーからもう 1 つの要求が行われたとします。

これらのリクエストの間に他のユーザーがほとんど新しい投稿を作成しない場合、またはその間にデータベース内の投稿の設定値が変更された場合、サーバーで 2 番目のリクエストが実行されると、すべての投稿が 2 番目のリクエストに再分類されます (つまり、次の 10 件の投稿を表示します)。ただし、データベースが更新されるため、2 番目のリクエストでは、以前の 10 件の投稿のほとんどが 2 番目のリクエストで取得される可能性が高くなります。

これらの重複したリクエストを回避する方法を知りたいです。データベースが動的な場合、Facebook やその他のソーシャル ネットワークがバックエンドでこの問題をどのように解決するか。

4

3 に答える 3

0

このような信頼性の低いソート方法は、まったく避けたいと思います。

ユーザーとして、私はむしろそのサービスをやめたいです。率直に言って、私はどの投稿を見るべきか、どの投稿を見ないかを決定する、あまりにもスマートなサービスが嫌いです. さらに、その上に動的に並べ替えます。

日付順、興味のあるタグ順、賢明で信頼できる定数順で並べ替えます。

于 2013-10-02T09:17:12.200 に答える
-1

スクリプトに、返された行 ID のレコードを保存します。

たとえば、基本的な制限を使用して、最初の選択が完了したときに最新の ID を保存し、ページ番号を使用して返されるレコードの制限を決定します。

SELECT id, somefield
FROM SomeTable
WHERE id < $SOMESTOREDVALUE
LIMIT $PAGENUMBERTIMESTEN, 10

または、各ページが返された後に最新のIDを保存します(これを実行するたびに保存する必要があります)

SELECT id, somefield
FROM SomeTable
WHERE id < $SOMESTOREDVALUE
LIMIT 0, 10
于 2013-10-02T08:56:46.613 に答える
-1

ユーザーがセッションで最初にリクエストを行った日時を保存すると、それを使用して posts テーブルをフィルタリングできます。

したがって、結果の 2 ページ目の SQL は次のようになります。

SELECT <some fields> FROM <sometables> 
WHERE DatePosted <= $timefirstseen LIMIT 10, 10

$timefirstseen がセッション変数からロードされた場所。これにより、ユーザーがアクセスを開始したときに存在していた投稿のみに結果が制限されます。

もちろん、ユーザーがセッションをクリアできるようにする機能を含めるか、ユーザーがホームページに再度アクセスしたときに自動的にそれを実行して、最終的に新しい投稿が表示されるようにする機能を含める必要があります!

于 2013-10-02T08:58:07.850 に答える