1

私は、開発中のMySQLデータベース上で動作するWebアプリケーションを持っています。アプリケーションをGoogle App Engineに移行することを検討しており、単純なリレーショナルデータベースモデルを非リレーショナルアプローチに変換する方法をよりよく理解したいと考えています。データベースの質問:単純なリレーショナル表を非リレーショナルに変更しますか?

私は長年のリレーショナルデータベースの人であり、BigTableなどの列ベースのDBでの経験はありません。 Googleが小規模なリレーショナルデータベースのデプロイメントをサポートしている場合には、私の質問は一般的でGoogleに限定されていないことを述べたいと思います。単純なリレーショナルモデルを非リレーショナルDBで表現する方法を理解したいと思います。名前とIDを持つ、私は多くのアイテムを持っている

Items Table 
------------ 

ItemID ItemName ItemPriority 
1  "Car"  7 
2  "Table" 2 
3  "Desk" 7 

ItemProperties Table 
--------------------- 

ItemID Property  Importance 
1  "Blue"   1 
1  "Four Wheels" 2 
1  "Sedan"   0 
2  "Rectangular" 1 
2  "One Leg"  1 

、それぞれ次のよう

私のデータベース(簡体字)があります。各項目には複数のプロパティがあり、各プロパティにはいくつかのパラメータがあります(それぞれのプロパティの名前と重要度のみが記載されていますが、それ以上です)。私には数千万のアイテムがあり、それぞれには何百ものプロパティがあります。

使用シナリオ:ItemNameを入力として受け取り、itemsテーブルでそのIDを調べ、そのIDですべてのプロパティを取得します。次に、(メモリ内の)プロパティのリストを分析し、結果を返します。

作業の90%は、(私が正しく理解するなら)非リレーショナルDBの痛み点であるパラメータに基づいてルックアップされます。

推奨されるアプローチは何ですか?

答えて

1

しばらくの間、非リレーショナルデータベースで作業していた人から、2つのテーブルを非リレーショナルデータベースに変換するのは本当に簡単です。

2つのテーブルを1つのオブジェクトに変換します。

アイテム: - イド - 名前 - プロパティ - PROP1 - PROP2

ストアデータストアの列(ビッグ表)、ドキュメント(CouchDBの)、または任意の他で全部使用する。

ids、名前、またはプロパティのいずれかでアイテムを検索できます。非リレーショナルDBの大きな痛みの1つである結合はありません。パラメータの参照は、私があなたが何を意味しているかを理解していない限り、実際には苦痛ではありません。複数のルックアップを行う必要があるかもしれませんが、ほとんどの時間は問題ではなく、rdbmsよりも優れたスケールです。

私の例では、実際には、非リレーショナル・モデルを実装して理解するのが簡単で簡単になると考えています。

各非リレーショナルデータストアには異なる規則と制約がありますが、一般的な意味での指針はありません。 CouchDBはオブジェクトのどの部分にもインデックスを作成することができます(例:ビュー)。 BigTableを使用すると、索引付けの高速検索を行うために非正規化データの複数のコピーを格納する必要があります。他の人は、データの保存方法を決める際には、考慮すべき点が異なります。一度SQLの世界を離れると、かなりの差別化があります。

0

GQLは結合をサポートしていません。次の2つの方法でこの問題を回避することができます

  • 自分を参加

ただ、アイテムをフェッチそのアイテムIDをチェックして、そのアイテムIDとItemPropertiesのクエリでください。あなたのテーブルはあなたが指定したのとまったく同じように見えます。確かに、これは2つのクエリですが、2つのクエリは単純です。

  • 使用はExpandoモデルはExpandoモデルで

、実行時に新しいフィールドを作成することができます。それらは索引付けされません。したがって、索引付けを検索したい場合、索引付けは遅くなるかもしれませんが、単に索引付けするだけです。 ListPropertyなどの複雑な型も使用できます。このような柔軟性によって、ItemPropertiesテーブルのすべてをItemsテーブルに置き、自分自身でクエリを保存する方法を考えることができます。クリエイティブに。

+0

最初のオプションについては、最初の、主に2番目のクエリは非常に遅くなりませんか? –

0

私は非常によく似たデータベース構造を持っています( "records"と "recordEntries"テーブルは "items"と "itemProperties"を反映しています)、同様の非リレーショナルデータベースへの移行を考えています。おそらく、Googleではなく、CouchDBやmemcachedbなどに行くでしょう。

あなたと同じように、私は非リレーショナルデータベース(開発者も)と一緒に作業している経験はありません。しかし、私たちはいくつかのアイデアを投げかけてきました。私たちの現在の考えは(自分のスキーマを使用して)、次のとおりです。

  • まず:識別子をキーデータベースに各アイテムに加えて1つのオブジェクトにその項目のプロパティフィールドを持つ(基本的にXML文書)とスタッフにそれを折りたたみます。アイテムを取得するたびに、すべてのitemPropertiesも返されます。

私たちの違いは、私たちが(Solrを使って)データベースの外部にコンテンツをインデックスすることです。したがって、YMMVのように "name"プロパティを使ってデータベース自体を検索する必要はありません。

  • 2番目:私たちは、上記のモデルではサポートできないすべての「リレーショナル」操作からリストを作成しています。これには、項目テーブルの特別なフィールドに基づいて項目を照会する2つの「グループ化」操作と、最近変更された項目をすべて検出しようとする照会が含まれます(以前はアイテムテーブル)。私たちは、これらのケースごとに代替実装を開発しています(幸運なことに、わずかしかありません)。

これが難しい場合は、別のモデルで同じ練習を試してみましょう。幸いにも、我々は計画する時間があります。

私たちは、Solrを使用して外部からすべてのインデックス処理を行っているので、itemProperties値の値をデータベース検索する必要はありません。また、アイテムテーブル

とにかくそれほど助けにはならないかもしれませんが、経験豊かな人々がどのような解決策を思いついているかを知りたいと思います。

PS:私の推測では、プロパティテーブルには何十億もの行が必要です。どのくらい正確に、どのハードウェアをMySQLサーバーで実行していますか? MySQLでスケーラビリティに問題がありますか?

+0

詳細な回答ありがとうございます。私はまだシステムがまだ生きていないので、何十億ものプロパティを持っていません。 MySQLのスケールは、Googleや代替製品に移行することで、私が事前に避けようとしていることの1つです。 –

0

あなたは、私がAppEngineのは

ID = 1、ItemNameの=車、ItemPriority = 7、プロパティ=のような構造を可能にすると考え、それをすべてを平らにする必要があります(青、1)、プロパティ=(四輪、2) ID = 3、ItemName = Desk、ItemPriority = 7

(0、0) ID = 2、ItemName =テーブル、ItemPriority = 2、プロパティ=(長方形、1)

同じ「フィールド」に複数の値を設定でき、複数のアイテムを使用できることに注意してください。

サンプルデータは1つのテーブルで3行になります。

関連する問題