6

次の式を使用して「トレンド」投稿を計算することを計画しています。

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

TableName:カウンター

HashAttribute:  counter_name
RangeAttribute: NONE
OtherFields: counter_value

したがって、次のテーブル設定で行うリクエストの種類の例を次に示します(例:user_id = 100)。

User Action 1:ユーザーの処置1:

ユーザーが新しい投稿を作成し、2つのカテゴリ(野球、サッカー)の投稿にタグを付けます

クエリ(1):

counter_name='post_id'とincrement+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):

以下をCategoriesテーブルに挿入します。

category_name='baseball', post_id=value_from_query_1, title=user_generated, content=user_generated, points=0

クエリ(4):

以下をCategoriesテーブルに挿入します。

category_name='soccer', post_id=value_from_query_1, title=user_generated, content=user_generated, points=0



最終目標は、次のタイプのクエリを実行できるようにすることです

。1.トレンドの投稿を

クエリする2.特定のカテゴリ

の投稿をクエリする3.ポイント値が最も高い投稿をクエリする

トレンドの投稿のクエリを実行できるように、テーブルをどのように構成できるかを誰かが知っていますか?それとも、これはDynamoDBに切り替えることで実行できる機能を放棄したものですか?

4

1 に答える 1

2

タイムスタンプとpost_idを使用したコメントのメモから始めます。
post_idジェネレーターとしてDynamoDBを使用するため、スケーラビリティの問題があります。これらの数値は本質的にスケーリングできないため、日付オブジェクトを使用することをお勧めします。クレイジーフォースピードで投稿を作成する必要がある場合は、Twitterがどのように投稿しているかについて読み始めることができます http://blog.twitter.com/2010/announcing-snowflake

トレンドチェックに戻りましょう
。あなたのシナリオはDynamoDBを誤用していると思います。
ほとんどの投稿が含まれるHOTカテゴリが1つあるとします。基本的に、投稿全体をスキャンする必要があり(データが適切に分散されていないため)、開始するたびにポイントを確認し、サーバーで比較を行います。毎回、予約済みの読み取りユニットの容量をすべて使用する可能性があるため、これは機能しないか、非常に高額になります。

これらのタイプのトレンドチェックのためのDynamoDBアプローチは、MapReduceを使用し
ています。これらを実装する方法については、こちらをご覧ください:http: //aws.typepad.com/aws/2012/01/aws-howto-using-amazon-elastic-mapreduce-with-dynamodb .html

時間を指定することはできませんが、このアプローチはスケーラブルであることがわかると思います。ただし、頻繁に使用することはできません。

別の注意点として、「トップ10/100」の流行の質問のリストを保持し、投稿が賛成されたときに「リアルタイム」で更新することができます。リストを取得し、新しく更新する必要があるかどうかを確認します。賛成の質問を作成し、必要に応じてデータベースに保存し直します。

于 2012-03-19T17:38:04.087 に答える