1

私は現在、mongodb と spring-data を使用するアプリケーションの db スキーマを設計しています。私はNoSQLデータベースにまったく慣れておらず、次の設計上の問題に苦労しています:

アプリケーションには、 と の 3 つの単純なドメイン オブジェクトUsersNotesありTagsます。ユーザーは複数のメモ (1:n) を所有でき、各メモには 1 つ以上のタグ (n:m) を使用して注釈が付けられます。

ここでの問題は、メモとタグの間の 1 対多の関係を設計するための最良の方法を理解できないことです。

主なユースケースは、注釈付きタグによってユーザーのメモを照会することです。したがって、私の最初のアプローチは、メモ内にタグを埋め込むことでした。ここでは冗長性に対処できます。高速な読み取り操作が本当に必要であり、メモやタグの更新はおそらくそれほど頻繁には発生しないからです。ただし、ユーザーのすべてのタグのリストを照会することも必要です (つまり、タグでメモを検索するときに先行入力機能を実装するため)。

現在、私の Note ドキュメントは次のようになっています。

{
   "id":"51bcf4a97aecbafaf5e79713",
   "label":"Label of the Note",
   "contents":"Contents of the Note",
   "owner":"username",
   "tags":[
      {     
         "name":"Tag1",
         "type":"default"
      },
      {     
         "name":"Tag2",
         "type":"default"
      }
   ]
}

私の主な質問は次のとおりです。

  • 埋め込みを使用する場合、ユーザーのすべてのタグのリストを (重複なしで) 効率的にクエリする最良の方法は何でしょうか?
  • この設定では、埋め込みよりも参照を使用した方がよいでしょうか? 特定のタグのリストで注釈が付けられたすべてのメモを照会するにはどうすればよいですか? (これはまったく可能ですか?)
4

1 に答える 1

2

説明したようにメモを保存し、さらに使用されているすべてのタグをユーザー ドキュメントに保存することをお勧めします。MongoDB ではデータの冗長性は許容されますが、書き込み用ではなく読み取り用にスキーマを設計する必要があるため、データの冗長性が最適な方法であることがよくあります。

次に、Java 側では、タグを User クラスのプロパティとして Set に保存するだけで、そこに一意のデータを確実に保存できます。

于 2013-06-24T21:55:53.157 に答える