2

最近、リレーショナル (MySQL) から NoSQL (couchbase) に移行しました。基本的にはソーシャル モバイル ゲームのバックエンドです。増加するユーザー数に対応するためにバックエンドをスケーリングする際に、多くの問題に直面していました。MySQL のロードを使用すると、複数のテーブル間に多くの結合があったため、ユーザーは多くの時間を要しました。データのほとんどが単一のドキュメントに保持されるため、特にデータをロードするときにcouchbaseに移行した後、大幅な改善が見られました.

欠点としては、クエリに関する限り、couchbase にも多くの制限があるようです。SQLクエリに代わるCouchbaseはビューです。map-reduce を使用してほとんどのクエリを処理することができましたが、時間ベースのクエリを処理する方法を理解するのに本当に苦労しています。たとえば、タイムスタンプ属性に基づいてユーザーをフィルタリングする必要があります。時間が現在の時間よりも短い場合にのみ、ユーザーを表示する必要があります。

if(user.time < new Date().getTime() / 1000)

ユーザーの時間が未来の時間に設定されると、このビューから除外されます。これは望ましい動作ですが、更新しない限り、ビューに再び追加されることはありません。更新しました。

現時点での解決策は、最初に x 個のユーザー ドキュメントを読み込み、次にアプリケーションで時間を確認することです。並べ替えは user.time 属性で行われるため、時間が現在の時間よりも短い、または近いユーザーが取得されます。しかし、これが実際にライブ環境で機能するかどうかはわかりません。理想的には、アプリケーション レベルでこの種のチェックを回避したいと考えています。

また、マッチメイキングなど、複数の時間ベースの属性をチェックする必要がある場合もあります。私たちの現在の戦略はそのような場合には機能せず、アプリケーションで行われたときにこれらのチェックに合格しないビューからドキュメントを取得することがよくあります。すでに同様の問題に取り組んでいる人が経験を共有できれば、本当にありがたいです。前もって感謝します。

アップデート:

1 つのキーに対してのみ機能する範囲クエリを使用してみました。私が言ったように、ほとんどの場合、機能しない複数の範囲を意味する複数の時間ベースのキーがあります。

4

1 に答える 1