DynamoDBデータベースを構成して、トレンド投稿のクエリを許可する方法は?
-
27-10-2019 - |
質問
次の式を使用して「トレンド」投稿を計算する予定です。
Trending Score = (p - 1) / (t + 2)^1.5
p =ユーザーからの投票(ポイント)。 t =時間の提出以来の時間。
DynamoDB(AmazonからのNOSQLデータベースサービス)でのトレンド投稿をクエリすることができるように、データベーステーブルを構築する方法に関するアドバイスを探しています。
DynamoDBには、テーブル内の各アイテムの主要なキーが必要です。主キーは、ハッシュ属性(文字列または数値)と範囲属性(文字列または数値)の2つの部分で構成できます。ハッシュ属性は各アイテムに対して一意でなければならず、必要です。範囲属性はオプションですが、使用される場合は、dynamoDBが範囲属性にソートされた範囲インデックスを構築します。
私が念頭に置いていた構造は次のとおりです。
TableName:ユーザー
HashAttribute: user_id
RangeAttribute: NONE
OtherFields: first_name, last_name
TableName:投稿
HashAttribute: post_id
RangeAttribute: NONE
OtherFields: user_id,title, content, points, categories[ ]
TableName:カテゴリ
HashAttribute: category_name
RangeAttribute: post_id
OtherFields: title, content, points
タブネーム:カウンター
HashAttribute: counter_name
RangeAttribute: NONE
OtherFields: counter_value
したがって、以下は、次のテーブルのセットアップで行うリクエストの種類の例です(例:user_id = 100):
ユーザーアクション1:
ユーザーは新しい投稿を作成し、2つのカテゴリ(野球、サッカー)の投稿にタグを付けます
クエリ(1):
counter_name = 'post_id'の現在の値を確認し、+1を増やし、新しいpost_idを使用します
クエリ(2): 以下を投稿テーブルに挿入します。
post_id=value_from_query_1, user_id=100, title=user_generated, content=user_generated, points=0, categories=['baseball','soccer']
クエリ(3):
以下をカテゴリのテーブルに挿入します。
category_name='baseball', post_id=value_from_query_1, title=user_generated, content=user_generated, points=0
クエリ(4):
以下をカテゴリのテーブルに挿入します。
category_name='soccer', post_id=value_from_query_1, title=user_generated, content=user_generated, points=0
最終目標は、次のタイプのクエリを実行できることです。
1.トレンド投稿のクエリ
2.特定のカテゴリの投稿のクエリ
3.最高点値が最も高い投稿のクエリ
トレンドの投稿のクエリを行うことができるように、テーブルをどのように構成できるかについて誰もが考えていますか?それとも、これは私がDynamoDBに切り替えることで行う能力をあきらめることですか?
解決
Timestamp vs Post_idでのコメントに関するメモから始めています。
dynamodbをpost_idジェネレーターとして使用するため、すぐにスケーラビリティの問題があります。これらの数値は本質的に無効であり、日付オブジェクトを使用する方が良いでしょう。クレイジーなスピードタイムで投稿を作成する必要がある場合は、Twitterがどのようにやっているかを読み始めることができますhttp://blog.twitter.com/2010/announcing-snowflake
それでは、トレンドチェックに戻りましょう:
あなたのシナリオはdynamodbを誤用していると思います。
ほとんどの投稿があるホットなカテゴリが1つあるとしましょう。基本的には、投稿全体をスキャンする必要があります(データは十分に広がっていないため)。各スタートがポイントを調べてサーバーで比較を行う必要があります。これは機能しないか、おそらくすべての予約済みの読み取りユニット容量を使用するたびに非常に高価になります。
これらのタイプのトレンドチェックのDynamoDBアプローチはMapReduceを使用しています
ここでそれらを実装する方法を読む: http://aws.typepad.com/aws/2012/01/aws-howto-using-amazon-amazon-amapreduce-with-dynamodb.html
時間を指定することはできませんが、このアプローチはスケーラブルであると思うと思いますが、頻繁に使用することはできません。
別のメモでは、「トップ10/100」のトレンディな質問のリストを保持し、投稿がvotvotedになったら「リアルタイム」で更新できます。リストを取得し、新しく更新する必要があるかどうかを確認します。必要に応じて、質問してDBに保存します。