1

私が PHP/MySQL で作業しているソーシャル ネットワークでは、友人ページがあり、ほとんどのネットワークと同様に、ユーザーが持っているすべての友人が表示されます。MySQL にフレンド テーブルがありますが、いくつかのフィールドしかありません。auto_ID、from_user_ID、to_friend_ID、日付

友達ページに、結果を並べ替えるためのいくつかの異なるオプションを用意したいと思います。

  1. 基本的に友達が追加された順であるauto_IDによって。それは単なる自動インクリメントIDです

  2. 日付による新しい友達、日付フィールドを使用します

  3. 友達の名前で、アルファベット順にリストが表示されます。

アルファベット順は、アドバイスが必要な場所です。アルファベット AZ のリストが表示されます。ユーザーが K をクリックすると、K で始まるすべてのユーザー名が表示されます。秘訣は、高速である必要があるため、ユーザーのテーブルで JOIN を実行することはオプションではありません。ほとんどの人は高速であると主張しますが、このアクションに必要なパフォーマンスではありません。私が思いついたアイデアの 1 つは、フレンドシップ テーブルにフィールドを 1 つ追加して、ユーザー名の最初の文字をそこに格納することでした。ユーザーはいつでも名前を変更できるため、ユーザーが名前を変更するたびに、何千もの可能性のあるレコードでこれが更新されるようにする必要があります。

これを行うより良い方法はありますか?

4

3 に答える 3

1

参加したくない場合は、ユーザーの名前またはイニシャルを友情テーブルに保存することが、実際に実行可能な他の唯一のオプションです。名前が変わるたびに何千ものレコードを更新しなければならないという問題について言及されていますが、これは本当に問題なのでしょうか? Facebook や MySpace のような主要なソーシャル ネットワーキング サイトについて話しているのでない限り、平均的なユーザーはこれを問題にするのに十分な数の友達を本当に持っているのでしょうか? そして、ユーザーが自分の名前を変更する確率を掛ける必要があります。これは、ユーザーごとに頻繁に発生するものではないと思います。

これらの更新が実際に重要である場合は、いつでもバックグラウンドで実行したり、ピーク時以外に発生するのを遅らせたりできます。確かに最新の精度を犠牲にしますが、実際、ほとんどのユーザーは気付くでしょうか? おそらくそうではありません。

編集:注意してください、上記の私の答えは、すでにそれらのレベルのユーザーがいる場合にのみ適用されます。まだ基本的にサイトを開発中の場合は、サイトを機能させることだけを考えてください。実際の問題になったときのスケーリングの問題について心配してください。

于 2010-01-13T15:21:51.817 に答える
0

また、memcached などのキャッシング ソリューションを検討することもできます。memcached ハッシュを常に更新するバックグラウンド プロセスを使用できます。このデータが必要な場合は、既にメモリ内にあります。

于 2010-01-13T15:24:09.740 に答える
0

名前を含むテーブルに参加してから、名前で並べ替えます。ごく普通のテーブル レイアウトを想定すると、次のようになります。

表の人物: ID、名、姓

テーブル フレンド: auto_ID、from_user_ID、to_friend_ID、日付

次のようなことができます。

Select person.id, person.firstname, person.lastname, friend.auto_id 
from Friend
left join on person where person.id = friend.to_friend_ID
where friend.from_user_ID = 1
order by person.lastname, person.firstname

また

Select person.id, person.firstname, person.lastname, friend.auto_id 
from Friend
left join on person where person.id = friend.to_friend_ID
where friend.from_user_ID = 1
order by friend.date desc

友人テーブルに列を追加して最初の文字を保持することを強くお勧めします。そのようなデータを複製する必要はありません (同期を維持することを心配する必要はありません)。それが結合の目的です。

于 2010-01-13T15:22:05.343 に答える