2009-06-11 7 views
10

モバイルアプリケーション(iPhone/Android)を構築中で、AmazonのSimpleDBにアプリケーションデータを保存したいと考えています。これらのサービスを提供するために独自のサーバーをホストしたくないからです。私はすべてのドキュメントを調べてきましたが、要素値の最大格納サイズは1024バイトです。AWS SimpleDBの属性の最大サイズ

私の場合、最大10Kのテキストデータを1024個格納する必要があります。

私は、他のプロジェクトが、プロジェクトのようなより大きなストレージニーズを持っているときにSimpleDBをどのように使用しているのかを知りたいと思っていました。私はそれがS3(ファイルシステム)に格納されているファイルへのポインタを格納できることを読んだ。それが良い解決策であるかどうかは分かりません。

私の考えでは、SimpleDBが正しい解決策であるかどうかはわかりません。誰かがこれまで何をしているのか、この問題を考えるための別の方法を提供することについてコメントしてもらえますか?

+0

データの取得にはどのような要件がありますか?それを検索したり、フィールドなどで区切ったりする必要がありますか? – Mark

+0

私はテキストデータを表示するだけです。このデータにタグを付ける予定で、1024バイトを超える文字列をユーザーに照会して表示する予定です。私は都市/州/記述の情報を持っていると思います。都市と州に対して照会すると、その説明がユーザーに表示されます。 –

+0

これはSimpleDBの優れた使い方のようです。アイテムを格納するときにテキストを分割するルーチンと、選択結果から戻すときにテキストを分割するルーチンを追加するだけです。 "SELECT desc from FROM Domain001 where city =?INTERSECTION state =?" – Mocky

答えて

14

10kのテキストデータを保存する方法はありますが、それが受け入れられるかどうかは、保存する必要があるものと使用する方法によって異なります。

大量のデータ(特にバイナリデータ)を格納する必要がある場合は、S3ファイルポインタが魅力的な場合があります。このシナリオでSimpleDBが追加する値は、SimpleDBに格納されているファイルメタデータに対してクエリを実行する機能です。

10kに制限されたテキストデータの場合、SimpleDBに直接格納することをおすすめします。 1つのアイテムに簡単に収まるが、複数の属性に分散する必要がある。これを行うには基本的に2つの方法があります。

一方的な方法は、柔軟性が高く、検索にも便利ですが、データに触れる必要があります。データを約1000バイトのチャンクに分割し、各チャンクを属性値として複数の値の属性に格納します。複数の値を持つ属性には順序付けが行われないため、各チャンクに順序番号を付ける必要があります(例:01)

1つの属性にすべてのテキストを格納しているということは、述語の属性名。 1kから200 + kまでの任意の項目に異なるサイズのテキストを追加して、適切に処理します。しかし、あなたの前に付いた行番号があなたの質問に肯定的になることに注意しなければなりません。例えば、01を検索している場合、すべての項目がそのクエリと一致します。

テキストをSimpleDB内に保存するもう1つの方法では、テキストチャンク内に任意の注文データを配置する必要はありません。あなたは、各テキストチャンクを別の名前付き属性に置くことによって注文を行います。たとえば、属性名はdesc01desc02 ... desc10です。次に、各チャンクを適切な属性に配置します。両方の方法でフルテキスト検索を行うことはできますが、この方法では検索が遅くなります。なぜなら、多くの述語を指定する必要があり、SimpleDBは各属性の別のインデックスを検索するためです。

データベースでは、このタイプの低レベルの詳細をデータベース内で処理するのに慣れているので、このタイプの作業をハックとして考えるのは簡単かもしれません。 SimpleDBは、この種のものをデータベースからクライアントにプッシュし、ファーストクラスの機能として可用性を提供する手段として特別に設計されています。

リレーショナルデータベースがテキストを1kチャンクに分割して実装の詳細としてディスクに格納していることが判明した場合、ハックのようには見えません。問題は、SimpleDBクライアントの現在の状態が、この種のデータ形式を自分で多く実装しなければならないということです。これは、理想的にはスマートクライアントであなたのために処理されるものです。スマートクライアントはまだ自由に利用できません。

+0

Mockyがこの記事を投稿したときに、素敵な小さな回答が書かれていました。 偉大な総和、私はそれに完全に同意します。 SimpleDBの速度と価格を考えれば、それは間違いなく価値があります。特に伝統的なDBの限界がもはや適用されないことに気が付いたとき。 – Mark

+0

はい、素晴らしい答えです、ありがとうございます。データを分割するには、より多くの思考と作業が必要ですが、データベースとサーバーをホストするよりも簡単になると思います。ありがとうございました。 –

1

あなたはコストを懸念している場合、あなたはSimpleDBの中にポインタをS3とメタデータにテキストを入れて安価であることを見つけるかもしれません。

+0

これは私が使用しようとしている技術です。スタートアップのために良い。 –

0

Simple Savant(私が作成したSimpleDB用のC#永続ライブラリ)は、Mockyによって記述された属性の拡張と、Lucene.NETを使用するSimpleDBデータの全文検索の両方をサポートします。

私はあなたがおそらくC#でアプリケーションを構築するが、あなたの質問は、トップの結果であるため、SimpleDBは、それは言及する価値が見えたフルテキストインデックスを検索するときにされていません実現しています。

UPDATE:私は上記の単純なSavantのリリースが利用可能になりました。

+0

これは完璧ですが、これは私が必要としていることです。自分のコードを管理していて、やりたくないからです。 –

1

その後、複数の値としてテキストの10Kのすべてのユニークワードを持つ属性を作成し、S3に10kのテキストを入れることができます。その後、検索は高速になります。しかし、フレーズ検索はありません。あなたが1「行」(名)内の1つの属性に格納することができますどのように多くの値

?私はドキュメントを見て、私には何の答えも出なかった。

- トム

+1

私はそれを理解しました。 simpleDBでの検索のみを行うには、一意のすべての単語のセット(小文字)を作成し、属性ごとに1024バイトに収まるように多くの単語を読み込みます。 3つまたは4つの属性に相当する典型的な英語のテキストの10k。それから、実際のテキストをs3に格納し、そのキーをsimpleDBに格納します。 SimpleDBを使用すると、アイテムごとに256の属性 - 値ペアが得られます。 –

+0

興味深いアプローチ。 –

0

シンプルダイブは、よく、簡単です。その中のすべてが文字列です。ドキュメントは非常に簡単です。そして、多くの使用制限があります。以下のような:

  • あなただけINSELECT * FROM ___ WHERE ItemName() IN (...)ItemName 20とSを行うことができます。
  • 一度に編集できるのはPUT(更新)のみです。
  • すべての読み取りは、計算時間に基づいています。したがって、LIMIT1000SELECTであれば、800(または何もない)とnextToken(さらにnextToken)を追加する必要があります。これは、次のSELECTが実際にリミット・カウントを返す可能性があるため、2つのSELECTの返された行の合計が元の制限よりも大きくなる可能性があることを意味します。あなたがたくさん選んでいる場合、これは懸念事項です。また、SELECT COUNT(*)を実行すると、同様の問題が発生します。 nextTokenと一緒にカウントを返します。そして、あなたはそれらをnextToken秒以上繰り返す必要があり、真の(合計)カウントを得るために戻ったカウントを合計する必要があります。
  • これらの計算時間はすべて、ストア内の大きなデータの影響を大きく受けます。
  • 多数のレコードを持って終了した場合ならば、あなたはおそらく、あなたがそう

単一のドメインにあまりにも多くを行う場合はAmazonがあなたの要求を絞ります
  • 複数のドメインにまたがって記録をシャードする必要があります大量の文字列データを使用するか、レコードを大量に使用する予定がある場合は、別の場所を見たい場合があります。 SimpleDbは非常に信頼性が高く、文書化されているように動作しますが、頭痛の原因になることがあります。

    あなたのケースでは、私はMongoDbのようなものをお勧めします。それ自体にも問題がありますが、この場合にはより良いかもしれません。しかし、多くのレコード(数百万以上)を持っていて、あまりにも多くのレコードにインデックスを追加しようとすると、SSDではなく、スピンデルであれば、それを破る可能性があります。