-2

簡単に言えば、投票される異種オブジェクトを使用して投票システムを設計する方法です。

たとえば、記事、動画、投稿、コメントなどを含めることができますが、それらすべてを「投票可能」にしたいと考えています。

問題は、パフォーマンスとスケーラビリティを適切なレベルに保つためにデータベースをどのように設計するかです。

いくつかの情報/要件:

  • 登録ユーザーのみが投票できます
  • すべての投票は、後の統計目的のためにデータベースに保存されます(集計されたカウンターを使用してライブで+時々それらを検証します)
  • 今後、他の投票可能なオブジェクトを追加します。
  • 1 人のユーザーに制限された投票は、1 つのオブジェクトにつき 1 回投票できます。
  • オブジェクトの複数のクラスにわたる累積ランキングはありません。
  • オブジェクトを表示している間、ほぼ常に投票数を表示する必要がありますが、集計された値を常に最新の状態に保つことは最も重要ではないため、おそらくここではキャッシュが機能します。場合によっては、ii を最新の状態に保ちたいと思うでしょう。

私の考え:

投票可能なオブジェクトを含むテーブルごとに、voteable_idすべての投票可能なオブジェクトで一意の列を追加します。ここでの問題は、この一意性を維持することです。たとえば、PostgreSQL のように単純なシーケンスを作成できない MySQL に取り組んでいます。

別のテーブルを保持voteable_idすることもできます。つまり、オブジェクトのテーブルでは単純な外部キーになります。次に、いくつかの列を追加して、「投票のブロック」などの投票の問題でそのオブジェクトを構成したり、集計されたカウンターを保持したりできます。

どう思いますか?それはうまくいくでしょうか?これは機能の 1 つにすぎないため、すべてのリソースを使用できるわけではないことに注意してください。;-)

たぶん、他のアイデア、またはさらに優れた検証済みのソリューションはありますか?

4

1 に答える 1

1

Ruby on Rails で使用されているポリモーフィック参照のアイデアを使用することもできます。

投票テーブルには、2 列の外部キーvotable_idvotable_type. はvotable_id投票されたアイテムのキーであり、 はvoteable_typeアイテムが存在するテーブルへのインジケーターです。RoR は文字列を使用しますが、ENUM または単純な整数でタイプをエンコードすることもできます。

これらの 2 つの列に 2 列のインデックスを作成すると (voteable_typeインデックスの最初の列から始まる)、任意の投票可能なテーブルと高速に結合できます。

于 2013-09-16T21:42:22.247 に答える