6

MongoDB と CouchDB を真剣に試してみたいと思っています。これまで、Mongo を少し使ってきましたが、Couch の RESTful なアプローチにも興味をそそられました。

リレーショナル DB で何年も働いてきましたが、非リレーショナル データベースでいくつかのことを行うための最良の方法は何かをいまだに理解していません。

たとえば、1000 の自動車販売店と 1000 の車種がある場合、各店が販売する車の種類を指定したいと考えています。各車には 100 の機能があります。リレーショナル データベース内で、中間テーブルを作成して、各カー ショップを ID を介して販売する車種にリンクします。No-sqlのアプローチとは?すべてのカー ショップが 50 種類の車種を販売している場合、販売するすべての車種のすべての機能をカー ショップ内に保存する必要がある場合、膨大な量のデータを複製する必要があります。

どんな助けでも感謝します。

4

4 に答える 4

3

CouchDB としか話せません。

データベースにデータを保持する最善の方法は、データを JSON に変換する以外に正規化しないことです。そのデータが「車」の場合、データベース内のすべての車に関するすべてのデータを貼り付けます。

次に、map/reduce を使用して、データの正規化されたインデックスを作成します。したがって、すべての車のインデックスが必要な場合は、最初にショップで並べ替え、次に車のタイプで並べ替えて、[shop, car-type] のインデックスで各車を発行します。

Map reduce は最初は少し怖いように見えますが、すべての複雑なことや btree を理解する必要はありません。理解する必要があるのは、キーの並べ替えがどのように機能するかだけです。

http://wiki.apache.org/couchdb/View_collat​​ion

それだけで、CouchDB の map reduce システムを使用して、さまざまなドキュメントに対して驚くほど正規化されたインデックスを作成できます。

于 2010-02-10T04:22:23.313 に答える
1

MongoDB でよく使用されるアプローチは、各カー ショップに車種の _ids のリストを格納することです。したがって、個別の結合テーブルはありませんが、基本的にクライアント側の結合を行っています。

埋め込みドキュメントは、このような多対多ではない場合により関連性が高くなります。

于 2010-02-09T22:11:21.467 に答える
0

リレーショナル データベースの概念は非常に明確です。「car_id、car_type、car_name、car_price」などの列を持つ自動車用のテーブルと、「shop_id、car_id、shop_name、sale_count」などの列を持つショップ用のテーブルがあり、「car_id」はデータ操作のために一緒に 2 つのテーブル。データベースを作成する際には、すべての列を適切に定義する必要があります。

SQL データベース システムでは、これらの列とテーブルを事前に定義する必要はありません。次のように、JSon などの特定の形式でレコードを作成するだけです。

"{car:[id:1, type:auto, name:ford], shop:[id:100, name:some_shop]}",  
"{car:[id:2, type:auto, name:benz], shop:[id:105, name:my_shop]}",  
.....  

あなたのシステムがあなたの管理のためにオンラインでサービスを提供するようになった後、データベース構造の設計にいくつかの欠陥があることに気付くかもしれません.あなたは将来の記録のために「店」の「従業員」の列を1つ追加したいと考えています. 次に、来る新しいレコードは次のとおりです。

"{car:[id:3, type:auto, name:RR], shop:[id:108, name:other_shop, employee:Bill]}",  

これを許可する SQL システムはありませんが、リレーショナル データベースではこの仕事は不可能です。

于 2016-01-12T14:54:11.120 に答える
0

HBase/BigTable の観点からすると、通常、データを完全に非正規化し、「リスト」フィールドまたは多次元マップ列を使用します (詳細な説明については、このリンクを参照してください)。

「列」という言葉は、「テーブル」や「ベース」と同じように、長年の RDBMS 経験の感情的な重荷を運ぶもう 1 つの言葉です。

代わりに、これを多次元マップのように考える方が簡単だと思います-マップのマップです。

多対多の関係の例では、2 つのテーブルを作成し、多次元マップ列を使用してテーブル間の関係を保持できます。

Hadoop/HBase FAQの FAQ の質問 20 を参照してください。

Q:[Michael Dagaev] Student と Course など、2 つのエンティティ間の多対多の関連付け用に Hbase テーブルをどのように設計しますか?

2 つのテーブルを定義します:ここでは列修飾子として ids ) 意味がありますか?

A[Jonathan Gray] : あなたのデザインは理にかなっています。あなたが言ったように、おそらく Student テーブルと Course テーブルのそれぞれに 2 つの列ファミリがあるでしょう。1 つはデータ用で、もう 1 つは学生またはコースごとの列です。たとえば、生徒の行は次のようになります: course:2002 = ... このスキーマを使用すると、クエリにすばやくアクセスして、学生のすべてのクラス (学生テーブル、コース ファミリー)、またはクラスのすべての学生 (コース テーブル、学生ファミリー) を表示できます。 )。

于 2010-02-09T22:01:24.683 に答える