こんにちは、Habrasociety!
私のプロジェクトの1つ(ブラックジャックおよびその他すべてのソーシャルチャーム)を実装するプロセスでは、プロジェクトドメインの一部のエンティティに対してユーザー
の投票機能 (いいね/嫌い、評価など)を実装
する必要がありました。
免責事項:残念なことに、いくつかの抽象的な外部投票サービスの機能についての議論のみが行われ、コードや有用なリンクはありませんが、知識のある人々からフィードバックを得る必要があります。既製のソリューションをGoogleで検索した後、適切なものは見つかりませんでした。 基本的に、ソリューション(さまざまなWebフレームワークのプラグイン)は、既存のテーブル(またはMongoDBの場合はコレクションオブジェクト)に追加のフィールドを追加することになります。このフィールドは、好き/嫌いの数、および既に投票したユーザーの数を書き込みます。 このようなソリューションには重大な欠点があります。一方で、投票アルゴリズムを簡単に変更するための十分な柔軟性がないため(適切なモデルを見つけるプロセスの新しいプロジェクトにとって非常に重要です)、他方では既存のコードの変更が必要であり、さらに悪いことに、レベル投票機能を追加するためのデータストレージ。
同時に、
cackle.me 、
disqus.comなど、サイトにコメントを追加する機能を提供するサービスが多数あります。サービスは開発中のプロジェクトの外部にあり、最小限の労力でサイト上のあらゆるものにコメントする機能を追加できます。ウェブサイト(またはアプリケーション内)。
あなたのサイトに投票を追加するための同様のサービスがないのはなぜですか?
投票サービスに必要な機能
- 外部API
- 外部サービス側のデータストレージ
- 音声による遅延データアップロードの可能性
- 外部サービスの側での古典的な好きな/嫌いなユースケースの解決
- あるオブジェクトに対するユーザー投票(like)
- 特定のオブジェクトのすべての投票(いいね!)
- すべてのユーザー投票(いつ、どのオブジェクトに対して、どのように)
- オブジェクトのリストを作成するときに、現在のユーザーが投票したオブジェクトとその結果に関する情報を取得します
- オブジェクトのリストを作成するとき、好きなもの/嫌いなものの数、または各オブジェクトの評価が1、2、3、4、5である星の数に関する情報を取得する
したがって、いいねや評価の処理のメインロジックは、外部サービスを引き受けます。 たとえば、特定のオブジェクトに対するユーザーの「いいね」が繰り返されているかどうかを確認し、そのような投票を許可しないようにします。 同時に、誰が自分のプロジェクトの側ですでに実装できるものに投票できるかというビジネスロジック。
私が見たい追加機能のうち:
- オブジェクト(タグ)の特定の側面に個別に投票する機能。
- 投票のバージョン管理(分割テストに便利です。あるグループのユーザーには「いいね」と「いいね」を許可し、別のグループには「いいね」を許可し、サービス上のユーザーの行動を監視します)。
- サブスクライブして遅延させることができる新しいいいね!に関するメッセージのキューにイベントを追加します(たとえば、バックグラウンドでの評価の再カウント)。
サービスとウェブサイトの統合
バックエンドとフロントエンド(Webクライアントまたはモバイルクライアント)からの2つの方法があるはずだと思います。 投票に関する情報をまったくあなたの側に保存しないことが可能であるため、あなたはクライアントから好きなものを作成したり、好きなものの数を取得したりするリクエストをクライアントから直接行うことができます。 したがって、ページは複数のソースから収集されます。 また、バックエンドでの投票に関する情報を収集し、結果をデータに挿入してからクライアントに送信して、外部APIにリクエストを送信することもできます。 おそらく非同期であっても、応答を待っている間に他のデータ処理を実行できます。
人気のある言語(Ruby、PHP、JS)用のプラグインが必要です。ミックスインやプロジェクトへの新しいモジュールの追加により、サブジェクト領域のオブジェクトを好きになったり嫌いにしたり、評価したりする機能を簡単に追加できます。
メリット
- ストレージレベルで既存のデータ構造に追加の音声情報はありません。
- Webサイトまたはモバイルアプリケーションに投票オプションを追加するための最小コード。
- クライアントツールと排他的に統合する機能。
- バックエンドサーバーからの負荷の一部を軽減します。
- 同時に複数の投票モデル(分割テストの便利なメカニズム)。
結論の代わりに
これは私の夢投票サービスのようなものがどのように見えるかです。 回答を受け取りたいのですが、誰かが同様のことをアドバイスできますか? それとも、そのようなサービスが必要でしたか?