2017-05-23 6 views
0

MySqlからCloudant NoSqlに移行する予定です。私はそれを行うための最良の方法が何かを理解したい。 Product(ProductIdプライマリキー)、Issue(IssueIdプライマリキー、ProductId Foreignキー)、Tags(Tag idプライマリキー、ProductId Foreignキー)、Location(LocationIdのプライマリキーの場所)の5つのテーブルがあります。製品テーブル)とPolicy(policyIdプライマリキー、IssueIdをプライマリキーとします)。mySqlデータテーブルをClodantドキュメントに移行する

ここでは、Cloudantでドキュメントを管理するための2つのアプローチが考えられています。

  1. (「問題は、」タグ」、 『場所』、 『ポリシー』、「製品」として、各テーブルの1つの文書タイプEXドキュメントタイプ)テーブルごとに固有のドキュメントタイプで行ごとに異なるドキュメントを保管してください。

  2. 一つの文書(タイプとすべての文書は、「製品」のみすべてのタグ、問題[ポリシー]、製品ごとの位置を維持する)で定義されたすべての関係で行ごとに異なる文書を保管してください。

どのアプローチはより良いですか?

答えて

0

答えは実際にデータのサイズと成長率によって異なります。前回のSQL->のNoSQLの移行では、私は(私はあなたの正確なスキーマを知らないので、私は推測します)あなたの第二のアプローチを使用しました:

{ 
    _id: "prod1", 
    name: "My product", 
    tags: [ 
    "red", "sport", "new" 
    ], 
    locations: [ 
    { 
     location_id: "55", 
     name: "London", 
     latitude: 51.3, 
     longitude: 0.1 
    } 
    ], 
    issues: [ 
    { 
     issue_id: "466", 
     policy_id: "88", 
     name: "issue name" 
    } 
    ] 
} 

このアプローチは、あなたが製品に関するほとんどすべてを取得することができます単一のCloudant APIコール(GET /products/prod1)でこのような呼び出しは、すべての主要な製品データと、SQL世界での結合(この場合はオブジェクトの配列またはオブジェクトの配列)を提供します。

あなたが別のコレクションにこれらのオブジェクトに関する追加情報を保存することもできますので、あなたはまだlocationsまたはpoliciesの別のデータベースをしたいかもしれませんが、あなたはサブセット(そのデータの例えば場所の名前と地理位置を保存することができます)を使用してください。これは、各製品内の参照「ロケーション」コレクションから一部のデータを複製することを意味しますが、クエリの効率を向上させます(データの更新を煩雑にする犠牲のもと)。

すべてのデータへのアクセス方法によって異なります。速度と効率を上げるために、できるだけ少ないAPI呼び出しでページをレンダリングするために必要なデータを取得したいと考えています。独自のデータベースにすべてを保持している場合は、に自分で結合する必要があります。、Cloudantには結合がないためです。これは、各「結合」に対して追加のAPI呼び出しが必要となるため、非効率的になります。

another way to managed "joins" in Cloudantがあります。これは、2次コレクションが大きい場合などに適しています。場所/タグ/問題の数が製品ドキュメントのサイズを大きくしすぎる場合

関連する問題