1

ユーザーが投票できるシンプルなWebアプリを構築しています。ユーザーがすでに投票したかどうかを確認するための最速の方法は何ですか。リレーショナルデータベースとドキュメントベースのデータベースの両方に興味があります(mongodb、...)

アイデアはほとんどありませんが、改善できると確信しています。

リレーショナルデータベース

投票用に別のテーブルを作成します。

|userid|articleid|

記事の投票を増やす前に、useridとarticleidの両方を含む行があるかどうかを確認してください。2つのクエリがあります。トリガーでこれを改善することは可能ですか?例えば:

|useridarticleid| unique column

投票する前に、アプリケーション側でuseridarticleidを生成します。useridarticleidを挿入してみてください。フィールドが新しい場合、トリガーが起動し、記事の投票列が増加します。

ドキュメントベース

これはもう少しトリッキーです。したがって、ドキュメントを次のように構成します。

{
  "id": "123",
  "content": "something",
  "num_votes": 2,
  "votes" : [
               "userid1",
               "userid2"
             ]
}

最初の「クエリ」-useridがvotes配列にあるかどうかを確認します。2番目の「クエリ」-そうでない場合はnum_votesをインクリメントします。

再び2つのクエリ。したがって、これを変更できると思いましたが、パフォーマンスが向上するかどうかはわかりません。

投票配列にユーザーIDを挿入します。ユーザーが記事の「開票」を配列で確認したい場合。ただし、トラフィックが多いとすべての記事が少し無駄になるため、パフォーマンスが低下する可能性があると思います。ここでRedditを想像してみてください。

4

2 に答える 2

1

リレーショナル データベース |userid|articleid| 両方のフィールドを主キーとして使用するのが最善の方法です。

2 番目の例では、投票をユーザー ドキュメントに入れるか、記事ドキュメントに入れるかを検討することもできます。

とにかく、後でこれらすべての決定を簡単に変更できるデザインの作成に集中することをお勧めします。

これを設計するさまざまな方法は、「同時に同じ記事に多くのユーザーがいる」または「異なる記事に多くのユーザーがいる」などのようなものを好みます.実際の使用法を見ることができるまで、どのアプローチが最適かつ最速で機能するかを判断するのに十分な情報がありません。後で学んだ情報に簡単に適応できるものを作成してください。

ところで:投票を同期的にカウントしないことも検討してください。ユーチューブの投票数は実際には「正確」ではないという記事(見つけられない)を覚えています...彼らは現在の投票数を推定し、バックグラウンドワーカースレッドで実際の数を計算しました。

于 2012-07-15T15:38:10.050 に答える
1

実際には、文書データベースでははるかに単純です。あなたの文書構造はそれにぴったりです。

{
  "id": "123",
  "content": "something",
  "num_votes": 2,
  "votes" : [
               "userid1",
               "userid2"
             ]
}

db.collection.update(
        {id:"123", votes:{$ne:"userid"}},
        {$push:{"votes":"userid"},$inc:{"num_votes":1}}
);

これにより、レコード id=123 がアトミックに更新され、userid が有権者のリストに追加され、userid がこのドキュメントの投票のリストにない場合にのみ、投票が 1 ずつ増えます。

したがって、1 つのクエリと 1 つの更新しかなく、実際には同じ操作です。

于 2012-07-15T19:49:30.243 に答える