0

Dynamo や Mongo などの NoSQL ストアについての私の理解では、非正規化の観点から考え、実行するクエリに基づいてテーブルを作成する必要があります。

どのようにテーブルをセットアップすればよいか悩んでいます。

実行したいクエリを特定しました。

通常のSQLクエリを「平易な英語」に翻訳しました

たとえば、実行したいクエリは次のように変換されます。

「date_x から date_y の間に撮影されたすべての写真を取得します。写真家は John で、投票数が多い順に並べられています」

私はテーブル結合を行うことができないので、これが私が思いついたものです:

photos
{
    name,
    url,
    photographer,
    date_created,
    likes,
    dislikes,
    num_voters,
    weighted_score
}

これは正しいアプローチですか?

私が好き、嫌い、num_voters、および weighted_score を持っている理由は、ユーザーが写真に投票するたびに、「行」を更新し、likes/dislikes/num_voters を増やし、weighted_score を再計算する必要があると信じているためです (そのため、投票者数が少ない高評価のアイテムはリーダーボードに影響しません)

でも、

「フィルタ」を適用しているため、Dynamo のようなキー/値ストアは必要ないと思いますか?

また、1 つの副次的な質問: たとえば、写真家のテーブルがあり、写真家を削除したいとします。写真を調べて写真家が削除するのは私の責任ですか? 繰り返しますが、非リレーショナルなので、カスケード型の機能はないと思いますか?

ありがとう

4

1 に答える 1

1

DynamoDB はインデックス付きのキーと値のデータベースであり、現在、各テーブルの主キーと範囲キーのみを定義できます。複数の属性で検索すると、インデックスのないテーブル スキャンが実行されるため、柔軟なクエリの例にはおそらく適していません。

MongoDB は、複数のインデックスを定義できるドキュメント指向のデータベースであり、ユース ケースにより適しています。

例: 「date_x から date_y の間に撮影されたすべての写真を取得します。写真家はジョンで、投票数が多い順に並べられています」。

db.photos.find({
    'photographer': 'john',
    'created': {
        $gte: ISODate("2012-07-01"),
        $lte: ISODate("2012-07-05")
    }
}).sort({'votes': -1});

好き/嫌い/投票の数などの増分カウンターについては、アトミック操作を参照してください。

非リレーショナル データベースではカスケード削除がサポートされていない (または関連していない) ことは間違いありません。関連するドキュメントを削除することで、アプリケーション層でこのロジックをサポートできます。一部の MongoDB ドライバーは、関連ドキュメントの取得に役立つデータベース参照 (DBRef)の概念をサポートしています。DBRef を使用しても複数のクエリが発生しますが、便利なヘルパーになる可能性があります。

于 2012-08-05T00:32:58.627 に答える