私はそれらにあまり精通していません(私は他のみんなと同じブログ/ニュース/例を読んだだけです)が、スケーラビリティの名の下に通常のリレーショナルDB機能の多くを犠牲にすることを彼らが選んだというのが私の見解です-説明してみます。
データテーブルに200行あるとします。
googleのデータセンターでは、これらの行のうち50行がサーバーAに、50行がBに、100行がサーバーCに保存されています。さらにサーバーDにはサーバーAとBのデータの冗長コピーが含まれ、サーバーEにはサーバーCのデータの冗長コピーが含まれています。
(実際には、使用されるサーバーの数はわかりませんが、何百万もの行を処理するように設定されているため、かなりの数を想像します)。
「select*where name ='orion'」を実行するために、インフラストラクチャはそのクエリをすべてのサーバーに送信し、返される結果を集約できます。これにより、必要な数のサーバー間でほぼ直線的にスケーリングできます(参考までに、これはmapreduceとほぼ同じです)
ただし、これはいくつかのトレードオフが必要であることを意味します。
一部のデータに対してリレーショナル結合を実行する必要がある場合、たとえば5台のサーバーに分散している場合、これらのサーバーのそれぞれは、行ごとに相互にデータをプルする必要があります。10台のサーバーに200万行が分散している場合は、これを試してください。
これはトレードオフ#1-結合なしにつながります。
また、ネットワークの遅延やサーバーの負荷などによっては、データの一部がすぐに保存される場合もありますが、1秒または2秒かかる場合もあります。サーバーが数十台ある場合、これはますます長くなり、通常のアプローチでは「誰もが最も遅い男が終わるまで待つだけです」はもはや受け入れられなくなります。
これはトレードオフ#2-につながります-データは、書き込まれた直後に常に表示されるとは限りません。
他にどのようなトレードオフがあるかはわかりませんが、頭のてっぺんからそれらがメイン2です。