web-dev-qa-db-ja.com

いくつの列が多すぎる列ですか?

ここの多くの人々が、1つのテーブルに20以上(私は55ものものを見たことがあります)の列を持つテーブルを引用していることに気づきました。今はデータベース設計のエキスパートであるふりをしていませんが、これは恐ろしい習慣だといつも聞いていました。これを見るとき、私は通常、1対1の関係で2つのテーブルに分割することをお勧めします。同時に、パフォーマンスの問題が発生する可能性があります(JOINが少なくなるなど)。だから私の質問はこれです:

本当に大規模なデータベースになると、通常は多くのNULL値が発生するという事実にもかかわらず、大量の列を持つことには実際に利点がありますか?

多くのNULLを含む多くの列、または多くのJOINを含むより少ない列のどちらがパフォーマンスへの影響を大きくしますか?

54
Stephen Collins

テーブルのデザインは、格納する必要のあるエンティティによって異なります。すべてのデータが一緒に属している場合は、50列(または100列)が適切です。

テーブルが normalized である限り、データベース機能と最適化の必要性を除いて、サイズに関する経験則はありません。

52
Oded

私はOdedに同意します。 500列のテーブルを確認しましたが、すべての列が正しい場所にありました。日常のオブジェクトについて保存したいファクトの数を検討するだけで、その理由がすぐにわかります。

これらの列をすべて選択したり、一部の列のみに関心があるときに選択する列を指定したりするのが不都合であることが判明した場合は、ビューを定義することをお勧めします。

7
Brian Hooper

いくつの列が多すぎる列ですか?

別の列を追加するのが意味をなしていない、または正しいと感じたとき。

通常はアプリケーションによって異なります。

7
graham.reeds

odbcの文字制限は8000 ...です。これは物理的な制限であり、これを超えると非常にイライラします。

私は138列のテーブルで作業しました。恐ろしく書かれていて、正規化できたでしょう。このデータベースは、データベース設計に慣例があるのか​​疑問に思って、一度にすべてをテストすることに決めた誰かの作成であるように見えますが。

データウェアハウジングサーバーとレポートサーバーを使用する場合、フラット化されたテーブルが非常に広くなるのはよくあることです。これらは非常に高速であり、パフォーマンスのためにデータベースエントリをRAMに格納する必要がないことを意味します。

2
John Nicholas

列が多すぎると、null(悪)が多くなり、テーブルがマップされる扱いにくいオブジェクトになります。これにより、IDE=の読みやすさが損なわれ、メンテナンスが妨げられます(開発コストが増加します)。場合によっては、高速な読み取りが必要な場合は、非正規化テーブルを使用します。たとえば、レポートまたはクエリのみに使用されます(「CQRS」パターンを検索します) )はい。「Person」には100万個の属性がありますが、新しい用途ごとに新しい列を追加する代わりに、これらのモノサイリックテーブル(設計は正規化に先行する)を分解して、より小さいエンティティ(「address」、「phone」、「hobby」)に一致させることができます。小さいサイズのオブジェクト(およびテーブル)を使用すると、非常に多くの利点がもたらされ、ユニットテスト、OOP、およびSOLIDプラクティスなど)が可能になります。

また、結合を回避するために多数の列を束ねることに関しては、読み取りと書き込みの両方の典型的なワークロードを想定すると、結合を回避することによるパフォーマンスの向上は、インデックスのメンテナンスによって失われると思います。読み取りパフォーマンスのためにフィールドにインデックスを追加することは、それらのフィールドを独自のテーブルに移動する必要があることを示している可能性があります。

1
awgtek

私の経験によれば、特に大きなデータベースでは結合が頻繁に発生する傾向があるため、結合は少ない方が良いとされています。データベーステーブルが単一のエンティティ(学生、教師など)を格納するように設計されている限り、これは問題ありません。これは、後でコードでオブジェクトとして表されるようにするためです。したがって、エンティティを複数のテーブルに分割する場合、後でオブジェクトを埋めるために、いくつかの結合を使用する必要があります。また、ORMを使用してデータアクセスレイヤー(.NetのLinqなど)を生成すると、テーブルごとに個別のクラスが生成されます(もちろん、それらの間の関係がありますが)、これは使用が難しくなります。

もう1つは、クエリで返す列を指定できることです。これにより、アプリケーションに渡されるデータが減りますが、別のテーブルの単一の列でも必要な場合は、結合を行う必要があります。また、ほとんどの場合、列が非常に多いため、データベースに大量のデータが格納される可能性が高くなります。したがって、この結合はNULLよりも害が大きくなります。

私が取り組んだプロジェクトはそれぞれ異なるため、各ストーリーのバランスを見つける必要があります。

1
Thea

多くのNULLを含む多くの列、または多くのJOINを含むより少ない列のどちらがパフォーマンスへの影響を大きくしますか?

格納するデータ、作成するインデックスなどに完全に依存します。何が保存されているかを知らない限り、他の人よりもうまく機能することを保証することはできません。一般に、大きなテーブルがある場合、正規化ルールはデータを異なるテーブルとユーザーFKeyに「強制」しますが、常に1つの大きなテーブルよりもパフォーマンスが優れていることに同意しません。単純なクエリよりも大きなクエリでエラーが発生する可能性がはるかに高いため、エラーが発生する場合がある数十のクエリで6〜7レベルの結合で終了できます。

あなたがしていることのいくつかの要件を投稿するなら、多分私たちはあなたがDBを適切に設計するのを手伝うことができます。

0
eugeneK

また、テーブルのユースケースにも大きく依存します。読み取り用に最適化したい場合は、すべてを1つのテーブルにまとめることをお勧めします。

NO-SQLの世界(たとえば、cassandra/hbase)では、列の数に制約はなく、実際には多くの列を使用することをお勧めします。これは、保管方法にも起因します(ギャップなし)。調査中の価値があります。

0
Albert