30

一般的なデータベース構造の質問があります。私のシナリオでは、たまたまmongodbを使用しています。

ユーザーが曲のリスト(タイトル、アーティストなど)をアップロードできるアプリケーションを作成していますが、すべてのユーザーに1つのsongListコレクションを使用するか、個々のユーザーに個別のsongList.user#コレクションを使用するかがわかりません。ユーザーは自分に関連付けられた曲のみを照会できるため、ユーザーAはユーザーBの曲について知ることはありません。

コード例:

ユーザーごとに複数のコレクション

db.songList.userA.find()
{"title": "Some song of user A", "artist": "Some artist of user A"}

db.songList.userB.find()
{"title": "Some song of user B", "artist": "Some artist of user B"}
  • 長所
    • クエリするコレクションサイズが小さい
  • 短所
    • 保守性
      • 1,000ユーザーは1,000コレクションを意味します

vs所有する「user」フィールドを持つ単一のコレクション

db.songList.find({"user":"A"})
{"title": "Some song of user A", "artist": "Some artist of user A", "user": "A"}
  • 長所
    • 必要が生じた場合にユーザー間でクエリを実行する柔軟性
  • 短所
    • パフォーマンス

私は賛否両論のリストを作成しようとしていますが、まだフェンスにいます。各ユーザーの曲が互いに分離されることを考えると、どちらのアプローチが優れていますか?私の主な関心事は、メンテナンスとクエリのパフォーマンスです。

前もって感謝します。

4

2 に答える 2

15

NOTユーザーごとに個別のコレクションを作成することをお勧めします。

ドキュメントを読む

デフォルトでは、MongoDBにはデータベースあたり約24,000の名前空間の制限があります。各名前空間は628バイトで、.nsファイルはデフォルトで16MBです。

各コレクションは、各インデックスと同様に名前空間としてカウントされます。したがって、すべてのコレクションに1つのインデックスがある場合、最大12,000のコレクションを作成できます。--nssizeパラメーターを使用すると、この制限を増やすことができます(以下を参照)。

コレクションごとに特定の最小オーバーヘッド(数KB)があることに注意してください。さらに、bツリーのページサイズは8KBであるため、インデックスには少なくとも8KBのデータスペースが必要です。コレクションが多く、メタデータがページアウトされると、特定の操作が遅くなる可能性があります。

そのため、ユーザーが名前空間の制限を超えた場合、それを適切に処理することはできません。また、ユーザーベースの拡大に伴い、パフォーマンスが高くなることはありません。

アップデート

@HenryLiuがコメントで述べたように。WiredTigerストレージエンジンを使用するMongodb3.0以降の場合、これは制限ではなくなります。

docs.mongodb.org/manual/reference/limits/#namespaces

于 2012-12-10T07:18:52.977 に答える
9

MongoDBは、水平方向のスケーリングに優れています。動的クラスター全体でコレクションをシャーディングして、データの高速でクワイアブルなコレクションを生成できます。

したがって、コレクションサイズを小さくすることは実際にはプロではなく、この理論がどこにあるのかわかりません。SQLにはなく、MongoDBにもありません。シャーディングのパフォーマンスは、適切に実行された場合、単一の小さなデータコレクション(小さなオーバーヘッド)をクエリするパフォーマンスに関連している必要があります。そうでない場合は、シャーディングの設定が間違っています。

@Sushantが引用したように、MongoDBは垂直方向のスケーリングに優れていません。ここでは、MongoDBのnsサイズが重大な制限になります。引用で言及されていないことの1つは、インデックスのサイズとカウントもnsサイズに影響を与えるため、次のように説明していることです。

したがって、すべてのコレクションに1つのインデックスがある場合、最大12,000のコレクションを作成できます。--nssizeパラメーターを使用すると、この制限を増やすことができます(以下を参照)。

于 2012-12-10T08:24:04.987 に答える