6

私はデータベース アーキテクトではないので、この質問は完全にソフトウェア開発者の観点からのものです。私は現在、単純な設定データベースを取得するために取り組んでおり、さまざまなタイプを SQL サーバーに格納する最も効率的でパフォーマンスの高い方法は何か疑問に思っていました。たとえば、SettingA は boolean、int、float、または string 値を持つことができます。そのデータを保存するための最も効率的な方法と、取得するための最もパフォーマンスの高い方法は何ですか。

  1. すべての型を文字列である 1 つのフィールドに格納し、アプリケーション サーバーにそれを適切な値に変換させます。

  2. さまざまなタイプのさまざまなフィールドを用意し、アプリケーション サーバーにどのフィールドが null でないかを確認して使用させます (BooleanValue、StringValue、IntValue、FloatValue で、1 つだけが非 null で値を持つ)。

  3. タイプに基づいて設定を異なるテーブルに正規化し、そのタイプが使用されている場合にのみテーブルに値を追加します。(Settings テーブルへの外部キーを持つ 4 つのテーブル BooleanValues、StringValues、IntValues、FloatValues)。SP は、レコードがあるテーブルを返します。

パフォーマンスは間違いなく私の最大の懸念事項ですが、スペースの問題は僅差で 2 番目です。

4

4 に答える 4

1

設定を XML 列に保存します。

これは、単一の XML 設定ドキュメント内の項目のすべての設定を意味し、一度に取得して更新できるようにします。ストレージ コストを削減し、クエリを最適化するためのスキーマを提供します。データベースは、設定値のデータ型を認識します。

設定の特定の値を持つすべての項目に対してクエリを実行する場合は、XML インデックスや XQuery クエリを使用できます。

これがどのように見えるかを示すために SQLFiddle を作成しました: http://sqlfiddle.com/#!6/49c34/1

インデックス作成については、XML インデックス、特にSelective XML Indexesをご覧ください。

選択的 XML インデックス機能を使用すると、XML ドキュメントから特定のパスのみをインデックスに昇格させることができます。インデックスの作成時に、これらのパスが評価され、それらが指すノードが細分化され、SQL Server のリレーショナル テーブル内に格納されます。この機能は、Microsoft Research が SQL Server 製品チームと協力して開発した効率的なマッピング アルゴリズムを使用します。このアルゴリズムは、XML ノードを単一のリレーショナル テーブルにマップし、わずかなストレージ スペースしか必要とせずに並外れたパフォーマンスを実現します。

通常、設定が一緒に挿入されて取得される場合、設定ごとにテーブル行を使用するよりも、これがうまく動作することを期待しています。その場合、それらをビットにリッピングし、ビットをテーブルの行に分散させて、それらを取得して取得するときに再度接着するだけでは意味がありません。

いくつかの特定の設定、またはこれらの特定の設定の基準を照会する場合は、選択的な XML インデックスがこれを実現するのに役立ちます。

いつ注意するか:

  • アイテム間で設定が大幅に異なる場合。共有スキーマがなく、設定ドキュメントに必要なストレージが大きくなり、場合によっては大きすぎるためです。
  • 適切に実行するために、設定ドキュメントのさまざまな要素に対して幅広いクエリが必要な場合。おそらく、多くのインデックス作成スペースが必要になるでしょう。
  • 設定の一部が他の設定よりも頻繁に変更される場合は、それらを分割して個別に保存することをお勧めします。そうしないと、1 ビットいじるたびに設定ドキュメント全体を更新するリスクがあります。
于 2013-04-03T16:16:51.843 に答える
1

私は次の提案をしたいと思います。高レベルの設計に焦点を当てます。

まず、あなたのシステムは LOB (基幹業務システム) であり、データウェア ハウスではないようです。そのため、別のビジネス エンティティの場合は、NF に従って正規化する必要があります。通常、3 番目の NF で十分です。

特定の質問については、4 つの異なるデータ型を持つことができるフィールド [SittingA] があります。それらを異なる列またはテーブルに正規化する必要はないと思います。追加のビジネス ロジックを追加して、さまざまな列またはテーブルへの書き込みを制御する必要があり、クエリを実行するときに、クエリを実行する場所を特定する必要があります。

それらを Varchar データ型の 1 つの列に格納できますが、varchar 列の値をハッシュする計算列を作成し、計算列にインデックス (ハッシュ インデックス) を作成します。ストア プロシージャを使用して、ハッシュ規則とクエリを完了します。

これにより、ロジックをシンプルかつすっきりさせることができます。

さらに質問や懸念がある場合は、質問を更新するか、コメントをお寄せください。

于 2013-04-03T16:22:17.450 に答える
0

データベース サーバーとアプリケーション サーバーのレイテンシが測定可能 (> 1ms) であるという作業上の前提で、オプション 2 を選択します。 . データベースはストレージをブロック単位で編成し、同じ行にある (通常は 4KB のブロック サイズよりも小さい) ことは、より高速なアクセスを意味します。

ここで、設定用の主キーを使用して別のテーブルを設定することをお勧めします。(列が少なく、小さいほど、取得が速くなります。) 通常、PK には INT を使用することをお勧めします。これにより、迅速な外部キーの解決が可能になります。

于 2013-04-03T16:14:36.197 に答える