3

バックグラウンド

各列に名前を付けて、テーブル行を MongoDb ドキュメントとして保存しています。テーブルに対象の列があるとしましょう: IdentifierPersonDateCount。MongoDb ドキュメントには、テーブル データとは別に、 で表されるいくつかの追加フィールドもありますtimestamp。列は固定されていません (これが、最初にスキーマフリー データベースを使用して列を格納する理由です)。

さまざまな複雑なクエリを実行する必要がありますが、これまでのところ特定されていません。クエリのパフォーマンスがボトルネックになることは考えられますが、パフォーマンスについてはあまり心配していません。挿入されると、ドキュメントは変更されず (同じドキュメントがIdentifier代わりに作成されます)、挿入はそれほど頻繁ではありません (たとえば、1 日あたり 1000 個の新しい MongoDb ドキュメント)。そのため、データ量は時間の経過とともに着実に増加します。

簡単なアプローチは、次のような MongoDb ドキュメントのコレクションを持つことです。

{
   _id: XXXX,
   insertDate: ISODate("2012-10-15T21:26:17Z"),
   flag: true,
   data: {
       Identifier: "AB002",
       Person: "John002",
       Date: ISODate("2013-11-16T21:26:17Z"),
       Count: 1
   }
}

オブジェクトごとに 2 つのフィールドを持つ配列を使用して、別のアプローチ (たとえば、この質問の受け入れられた回答) を見てきました。

{
   _id: XXXX,
   insertDate: ISODate("2012-10-15T21:26:17Z"),
   flag: true,
   data: [
       { field: "Identifier", value: "AB002" },
       { field: "Person", value: "John001" },
       { field: "Date", value: ISODate("2013-11-16T21:26:17Z") },
       { field: "Count", value: 1 }
   ]
}

質問

2番目のアプローチはまったく意味がありますか?

はいの場合、どちらを使用するかをどのように選択しますか? 特に、あるアプローチでは簡単/安価で、別のアプローチでは困難/コストがかかる特定の種類のクエリはありますか? どちらに進むべきかについての「経験則」、または両方の賛否両論のリストはありますか? 1 つのアプローチが不便である実際のケースの例は、特に価値があります。

4

2 に答える 2

1

ここの他の例とあなたの例の状況は同じではないと思います。もう 1 つの例では、2 つの回答のうちの 1 つを含むアイテムのリストを作成しています。これは、より適切には配列内に配置されます。目標は、条件に一致するサブドキュメントのリストを返すことです。あなたの例では、オブジェクトはすべて異なる種類の情報を保持しているため、オブジェクトを記述しているだけであり、サブドキュメントの検索可能なビットを取得する必要はありません。

于 2013-10-29T06:45:16.903 に答える