1

非正規化テーブルを使用することと、2つの別々のテーブルを使用して結合を使用してデータにアクセスすることのトレードオフを知る必要があります。EntityFramework4を使用しています。

私の場合、2つのテーブルOrderOrderCategoryDetails。これらの2つのテーブルを1つのテーブルにマージする方が良いかどうかを考えていますか?

  • 非正規化されている場合、追加された列はスパースになります( 100%空OrderCategoryOrderSubcategoryなる可能性があります。常に少なくとも50%空になります)
  • 一方、そのままにしておくと、頻繁に結合操作が実行されるのではないかと心配です(つまり、特定Orderの情報を照会するときはいつでも、そこからの情報が必要になりOrderCategoryDetailsます。

現在、私はテーブルを正規化し、ナビゲーションプロパティを使用しています。

  • OrderItemインスタンスから注文カテゴリ情報にアクセスするには

    OrderItem orderItem = _context.OrderItems.Where(...).FirstOrDefault();
    if(2 == orderItem.SalesOrder.Category.OrderCategory){ ...}
    
  • OrderインスタンスからOrderCategory情報にアクセスするには

    Order order = _context.Orders.Where(...).FirstOrDefault();
    if(2 == order.Category.OrderCategory){ ...}
    

これは私のスキーマです:

表:注文

  • ID(主キー)
  • 日にち
  • ItemCount
  • OrderCategoryInfo(FK-にOrderCategoryDetails参加OrderCategoryDetails.ID

表:OrderCategoryDe​​tails

  • ID(主キー)
  • OrderCategory
  • OrderSubCategory

テーブル:OrderItem

  • OrderItem ID(主キー)
  • 注文ID(FK-参加Order

使用したデータベース:SQL Server 2008 R2

4

1 に答える 1

5

私の一般的なアドバイスは、次の質問を自問することです。最初のテーブルのすべての行に2番目のテーブルの行が必要ですか?答えが「はい」の場合は、データを非正規化する方がよい場合があります。答えが「いいえ」の場合は、別のテーブルとして保持する方がよいでしょう。

2つのテーブル間に外部キーの関連付けを設定する限り、結合を実行することによるパフォーマンスへの影響について心配する必要はありません。それは病的な状況でのみ問題になります。

コメントスレッドでの回答に基づいて、テーブルを分離し、2つの間に外部キー関係を設定することをお勧めします。

さらにパフォーマンスの問題が発生した場合は、問題のあるSQLでプロファイラーを実行し、プロファイラーが推奨するインデックスを追加します。ただし、これは頻繁に使用されるクエリに対してのみ行ってください。インデックスはクエリを高速化するのに最適ですが、挿入のパフォーマンスが犠牲になるため、注意してください。

于 2012-05-29T11:52:28.263 に答える