2012-02-18 8 views
5

私は投稿を「傾向」を計算するために、次の式を使用して計画しています:ユーザーからのトレンドポストのクエリを許可するためにDynamoDBデータベースを構成する方法はありますか?

Trending Score = (p - 1)/(t + 2)^1.5 

P =票(ポイント)。 t =提出からの時間(時間単位)。

私はDynamoDB(Amazonのnosqlデータベースサービス)を使用してトレンドポストをクエリできるように、データベーステーブルの構造をアドバイスしたいと考えています。

DynamoDBには、テーブル内の各項目の主キーが必要です。主キーは、ハッシュ属性(文字列または数字)と範囲属性(文字列または数字)の2つの部分で構成されます。ハッシュ属性は、各項目ごとに一意でなければならず、必須です。範囲属性はオプションですが、使用される場合、DynamoDBは範囲属性にソートされた範囲インデックスを作成します。投稿

HashAttribute: post_id 
RangeAttribute: NONE 
OtherFields: user_id,title, content, points, categories[ ] 

テーブル名:

テーブル名:

HashAttribute: user_id 
RangeAttribute: NONE 
OtherFields: first_name, last_name 

テーブル名のユーザーは次のよう

私が念頭に置いていた構造が入るカテゴリーを

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):

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 



を最終目標であります次の種類のクエリを実行できるようになります。
最高点での投稿のための特定のカテゴリ

3.クエリ内の記事のための傾向ポスト

2.クエリ用 1.クエリは値

い誰も私は私のテーブルを構築できるか任意のアイデアを持っていますトレンド投稿のクエリを実行できるようになりましたか?または、これはDynamoDBに切り替えることでできることですか?

+1

どのデータベースを使用しているのかは具体的な方がよいでしょう。様々な "NoSQL"データベースは大きく異なります。 –

+0

トレンドの投稿をどれくらい頻繁に再計算しますか?上記のタイムスタンプはどこに保管していますか?あなたはいつ投稿を時代遅れの対象から外すことができますか? – Nick

+0

@Layble私はインクリメンタルカウンタとしてpost_idを使用することを計画していたので(降順でpost_idをソートすると最新の投稿が表示されます)私がpost_idとタイムスタンプを使用することを考えていたのは、categoryテーブルに重複したRange Attributesの可能性を避けるためでした(例:2人の異なるユーザーが全く同じ時間にサッカーについて投稿した場合)。少なくとも毎分トレンドの投稿を再計算したいと思う。 –

答えて

1

タイムスタンプvs post_idであなたのコメントにメモを書き始めています。
あなたは、post_idジェネレータとしてDynamoDBを使用する予定であるため、そこにはスケーラビリティの問題があります。 これらの数値は本質的にスケーラブルではないので、日付オブジェクトを使用する方がよいでしょう。あなたがさえずりがそれをやっているかについて読み始めることができますクレイジー速時間で記事を作成する必要がある場合 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」トレンディな質問 のリストを保持し、投稿をアップアップしたときに「リアルタイム」で更新することができます。リストを取得して、必要に応じてチェックします新しくアップした質問で更新され、必要に応じてdbに保存されます。

+0

http://engineering.twitter.com/2010/06/announcing-snowflake.htmlにアクセスできません。 https://blog.twitter.com/2010/announcing-snowflakeにアクセスします。 – Kibria

関連する問題