web-dev-qa-db-ja.com

データをBLOBとして保持することにより、ALTERTABLEをオンラインにします

方法を教えてくださいextreme de-normalization (store the value as a serialized blobオンラインでテーブルを変更するのに役立ちますか? ソース

さらに、スキーマを変更できることが重要です。ALTERTABLEをオンラインで実行できるデータベースを使用するか、データベースの制限を回避し、ALTER TABLEを非破壊的に実行する方法を構築するかまたは極端な非正規化を使用します(その時点で使用されているスキーマを推測するために使用できるバージョンとともに、値をシリアル化されたblobとして格納します)。これは、あらゆる種類のリアルタイムデータベース駆動型アプリケーションにとっておそらく重要ですが、新しい機能(新しいプロファイルフィールドなど)が常に追加されるソーシャルネットワークにとっては重要です。

1
VB_

それはこれが言っていることではありません。システムをオフラインにせずにスキーマを変更できるシステムはほとんどありません。最近のデータベースでさえ、通常、列を削除するために排他的なテーブルロックとテーブルの書き換えが必要です。これは、一部のワークロードで問題を引き起こします。フィールドを追加したり、フィールドを削除したりできるコンタクトブックについて考えてみてください。これらの操作のそれぞれがALTER TABLEを発行してデータのスキーマを変更した場合、完全に混乱することになります。それはスキーマが機能することになっている方法ではありません。

したがって、2つの従来のオプションがあります。

  1. スキーマレスデータ、
  2. エンティティ-属性-値モデル (これはスキーマレスとタイプレスの両方であることが多く、低速です。)

スキーマレスデータ

列をシリアル化されたblobとして格納すると、悪い音に聞こえるかもしれませんが、それはDBAが通常そのレベルのエンジニアリングは不可能であり、そこにドラゴンがいる可能性があります。バイナリ型を実装するのは彼らの賃金等級からちょうど外れています。それはまさに、ボンネットの下の高度なタイプで起こることです。たとえば、PostgreSQLでは、

これらのタイプは、実際には内部のバイナリブロブです。データベースは、演算子とそれらの文字列化を提供するだけです。 PostgreSQLではそれらは [〜#〜] toastable [〜#〜] バイナリタイプです。

JSONBの前とhstoreの前は、 Storable::nfreeze で同じことを達成していました。これは著者が呼んでいるものです極端な士気喪失。オブジェクトのバージョン(メタデータ)とオブジェクト自体をシリアル化し、すべてをデータベースにダンプします。

DBAは、宣言型言語(SQL)で記述し、リレーショナルデータをモデル化してクエリします。これは、JSONBのようなものを作成するために必要なスキルセットとはまったく異なります。スキルセットが異なるため、Stackoverflowとは異なるコミュニティです。 hstorejsonb、さらには SQL配列 のデータベースはいくつありますか?これらは難しい問題です。それを正しく行うことは、DBAにとってニッチなスキルです。

2
Evan Carroll