0

FBに「いいね」みたいな機能を実装したい。

ユーザーが好きなオブジェクトの下にあるボタンを簡単にクリックできるようにしたい。賛成票のみ。

問題は、彼らが好きなオブジェクトを覚えておきたいので、それをデータベースに保持する必要があるということです。簡単にするために、オブジェクトのタイプは 1 つしかないとしましょう。

最も簡単な方法は、多対多の関係 (ユーザーとオブジェクト) を実装するテーブルを作成することです。

私の質問は次のとおりです。

  1. パフォーマンスの観点から合理的な解決策ですか?このようなテーブルは非常に大きく、頻繁に使用されます。;)

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

4

5 に答える 5

1
  1. はい、そうです。いいねの削除/更新に問題はありません。Arjun Khosla が言ったように、キーを追加することを忘れないでください。

データベース構造は次のようになります

物体

ID  name
1   post
2   status

like_to_object

ID  objectID    userID  time
1   2           3       1231231231
2   1           5       1231231231
于 2013-02-08T18:22:04.093 に答える
1

オブジェクトが記事であり、記事リスト (一意の ID) のテーブル db があり、ユーザーがユーザー リスト (一意の ID) 用の独自のテーブル db を持っているとします。WordPress のように、オブジェクト (記事) 用の新しいメタ テーブルを作成するだけです。この目的だけでなく、このテーブルを他の将来の目的で複数回使用できます

    ID             object_id           meta_name            value
(unique ID)  (object/article id)   (meta name value)     (meta value)

「user_like」などの一意のメタ名値を使用して、類似データを複数の配列データに保存します。WHERE object_id == article idしたがって、後でメタテーブルから現在のデータを呼び出すだけで済みますmeta_name == 'user_like'

//example saving the data into DB

//get current data
//get a row value from meta table where object_id = article id 
//and meta_name = 'user_like'
$current_data = ....;
$array_data = array();
$array_data[$user_id] = array(
   'user_id' => $user_id
);

if( array_key_exists( $user_id, $current_data ) ){
    //user already like, ignore
}
else {
    //prefer to use + instead of array_merge,
    // in some cases array_merge make array data loose its array keys
    $current_data = $current_data + $array_data;
}

//save it back to meta table row
....

ちょうど私の意見:)

于 2013-02-08T18:44:26.913 に答える
0

テーブルを追加し、いいねを言う:

Likes
ID     ID_U     ID_O
1      5        7
2      5        9
3      5        11
4      4        7

ここ で、オブジェクトについては、ID_U投票した人のIDを参照してください。ID_O

于 2013-02-08T18:30:27.550 に答える
0

あなたがそれを行うことができる1つの方法...おそらく、人々が好きなものに頻繁にアクセスする必要はないように思われるので、多対多の関係を持つ代わりに、テーブルを持ち、どこにあるのかがより理にかなっuseridobjectidsobjectidsますID の区切られたリスト。代わりにIOW

userid objectid
1      1
1      2
2      1
2      2

持ってる

table user_likes_data
    userid objectids
    1      1,2
    2      1,2

それで

objectidのいいね数の実行中のカウントを含む列を作成するだけです。objectid別のテーブルを持つ、または作成する既存のテーブルに列を追加する

tabe some_table 
    objectid num_likes
    1        2
    2        2

そうすれば、実際には通常、インクリメントしてリストsome_table.num_likesに追加するだけuser_likes_data.objectidです。行数が大幅に少なくなり、user_likes_data全体的に使用されるスペースも少なくなります (好きなオブジェクトごとに複数の行よりも、区切られた値の単一のセルを使用することによるスペースとオーバーヘッドが少なくなるはずです)。some_table.num_likesそして実際には、特定のページで計算しようとするのではなく、選択するだけですuser_likes_data

于 2013-02-08T18:12:58.447 に答える