オプション (1) はひどいので、そうしないでください。ノードごとに 1 つの行を持つ単一の巨大なテーブルは、 EAVに硫黄臭とボーナスホーンが追加されたように、クエリを実行するのが困難になります。
XML で表されるデータをエンティティ (テーブル) および関係としてモデル化するか、XML ドキュメントを単に DB に格納します。
XML が規則的に構造化されている場合にのみ、XML をエンティティおよび関係として有効にモデル化できます。さまざまな自由形式の XML ファイルが多数ある場合、RDBMS で実際に有効にモデル化することはできません。それらが規則的である場合、これはしばしば最良のオプションです。
<root>
<parentnode attrib="value">
<child otherattrib="value2">content</child>
</parentnode>
<...>
</root>
これを次のようにモデル化できます。
- と列を持つ
parent
テーブル。とid
attrib
- and列を持つ
child
テーブルと、への外部キー参照を持つ列。id
otherattrib
parent_id
parent(id)
XML を正確にモデル化する方法は、XML によって異なります。何が必須で、何が必須でないのですか? 入力 XML 内のエンティティの正確な順序を再構築する必要がありますか? またはノード内の順序は重要ではありませんか? フリーフォームのネスト可能なエンティティはありますか?
1 種類の決定の例として、特定の子ノード タイプをゼロまたは 1 つ (ただしそれ以上) 持つことができる親ノードがある場合、2 つのテーブルと 1:1 のオプションでそれをモデル化することを選択できます。または、子の属性/コンテンツがnull可能である単一のテーブルで、子要素を親にマージできます。パフォーマンス (結合コストとテーブル幅およびページあたりの行数) と使いやすさの両方の点で、長所と短所があります。
XML 構造が厳密な場合は、テーブルとしてモデル化すると便利なことがよくあります。自由形式の場合、通常は XML として DB に保存し、xpath でクエリを実行する方が便利です。
XML ドキュメントとして保持すると、DB 内でインデックスを作成してクエリを実行するのが難しくなりますが、XML を DB から取得してアプリに渡すのははるかに簡単になります。xpath 式の関数インデックスは非常に役立ちます。XML フラグメントを格納できず、ドキュメント全体のみを格納できるように、フィールドCHECK
を強制する制約を追加することも価値があります。xml
IS DOCUMENT