2011-01-19 11 views
8

私は25の列を持つテーブルを持っています.20の列は、一部の(30-40%)行のNULL値を持つことができます。 今、空の列が20行ある行のコストはいくらですか?これでいい?Sqlデザインの質問

それとも

これらの20個の列を格納し、最初のテーブルに参照を追加するための別のテーブルを持っている良いデザインですか? この方法では、値がある場合にのみ2番目の表に書きます。

私はSQL Server 2005を使用しています。将来は2008に移行します。

のみ20列は、varchar型、残りSMALLINTある私が保管しています何

smalldate: これらの列は、それが属する行の異なる属性を格納します。これらの属性は、時にはnullになることがあります。

テーブルには10億行が格納されます

コメントしてください。

+6

使用しているデータベースサーバーはどれですか? SQL Server 2008は、影響を最小限に抑えてシナリオをサポートするスパース列の概念をサポートしています。 –

+0

この回答を見てください:http://stackoverflow.com/questions/229179/null-in-mysql-performance-storage/230923#230923そしてhttp://dev.mysql.com/doc/refman/5.0/ en/working-with-null。html – RobertPitt

+0

あなたはテーブルの継承を考えましたか? –

答えて

2

保存するデータの種類を説明する必要があります。これらの列のうちのいくつかを別のテーブルに移動する必要があるようです。

たとえば、同じ種類のデータに対して複数の列を表す複数の列がある場合は、別の表に移動すると言います。一方、異なる種類のデータを記述するためにこの列が多く必要な場合は、それをそのままにしておく必要があります。

だから、あなたがモデリングしているものに依存します。

+0

データを説明するための+1 ...問題の列を知っている場合は、再構成に関する助言を得ることができます(必要な場合) – scunliffe

+1

データと型についての詳細情報を追加しました – kheya

+0

@Projapati:詳細を提供することには消極的です。列に「それが属する行の異なる属性を格納する」と言うと、格納するデータの種類については何も教えてくれません。いくつかの例を挙げたいなら、私が何を考えているか教えてください。しかし、私はもっと続けていく必要があります。 –

2

いくつかの列が必要な状況がありますか?もしそうなら、おそらくあなたはある種の継承を使うべきです。たとえば、これが病院の患者に関する情報であり、女性患者にのみ意味のあるデータがある場合、これらの列を持つFemalePatientsテーブルを作成できます。女性患者のために常に収集されなければならない列は、別の表にNOT NULLとして宣言することができます。

2

データ型によって異なります(40個のnull可能なintは、値に関係なく、40個のnull不可能なintと基本的に同じスペースを使用します)。 SQL Serverでは、スペースは通常の手法ではかなり効率的です。 2008年にはSPARSE機能があります。

オプションの1:1リレーションシップを使用してテーブルを垂直方向に分割すると、ビューで2つのテーブルをラップし、ビューにトリガを追加して更新可能にし、基礎となる実装を隠す可能性があります。

多くのオプションがありますが、その多くはデータの読み込みと動作を見てから実装できます。

1

独自の属性セットに基づいてテーブルを作成します。だから、あなたのカラムの中には、それらのカラムを持たないテーブルにそのデータを置くのが理にかなっているデータがあるとします。可能な限り、複数のテーブルで同じ属性を繰り返さないようにしてください。あなたのデータが少なくともBoyce-Codd/5th Normal Formにあることを確認してください。間違ったことはありません。