データを異なるデータ ストアに分け、それぞれに利点があることをお勧めします。
例えば:
- BLOB を RDBMS に (MySQL として) 配置できますが、Amazon S3としてストレージに配置することをお勧めします。
- テキスト ドキュメントを RDBMS に配置し、"... LIKE %QUERY%..." でクエリを実行できますが、Elastic Search またはAmazon CloudSearchに配置することをお勧めします。
- セッション管理データを RDBMS に入れることもできますが、Amazon Elastic CacheまたはDynamoDBに入れることをお勧めします
- ルックアップ テーブルを RDBMS に配置することもできますが、メモリ内またはメモリ ベースの NoSQL (Memecached または Redis など) または DynamoDB 内に配置することをお勧めします。
また、上記のステートメントを別の方法で記述して、すべてを MongoDB または DynamoDB に格納することもできますが、別の場所に配置することを好みます。
データをさまざまなストアに配置する場合、データの種類とこのデータの使用法に関連するこのデータ ストアの単純さに基づいて、より単純で、分散され、スケーラブルで、通常はより高速なシステムを取得できます。
欠点は、データ ストア間でデータを同期する必要があることです。DynamoDB にレコードを追加したら、BLOB を S3 にアップロードし、CloudSearch でドキュメントを更新してレコードを MySQL に追加し、今後の分析のために関連する行をログ ファイルに書き込む必要があります。もちろん、これは、そのような複雑なデータとクエリを持つ極端なケースです。通常、2 つまたは 3 つのデータ ストアを混在させるだけで済みます。
システムにトランザクションが必要な場合、データを同期するのは非常に困難になるため、トランザクションをサポートするデータ ストアにすべてのデータを格納することをお勧めします。ただし、その場合でも、トランザクションの要件をデータの一部に制限し、他のデータ ストアの冗長データと一緒に暮らすことができます。たとえば、RDBMS または DynamoDB に参照レコードがない孤立した S3 オブジェクトを持つことは、通常は大きな問題ではありません。
分散データを操作するために書いている PHP (または他のプログラミング言語) コードを持つことに関しても、状況によって異なります。データ ストアでネイティブにサポートされている複雑な JOIN、GROUP_BY、FILTER 機能が必要な場合は、DB 機能を使用することをお勧めします。しかし多くの場合、適切な DB にクエリを実行し (たとえば、CloudSearch へのテキスト検索)、さまざまなデータ ストアからデータを組み立てるなど、コードを簡単に記述できます。