web-dev-qa-db-ja.com

1対1の関係は正規化されていますか?

レコードの統計データが大量にあるとします。例えば20-30 INT列。すべてが1つのテーブルに属しているため、セット全体を1つのテーブルに保持する方がよいですかOR 1対1の関係で接続された別のテーブルを作成します。

前者の利点は、JOINを回避し、対応するレコードのすべての統計データにすばやくアクセスできることです。

後者の利点は、カラムを整頓することです。最初の列は読み取り中心で、2番目の列は書き込み中心です。もちろん、行レベルのブロッキングでInnoDBを使用しているので、パフォーマンスに大きな影響はないと思います。

一般に、単一のレコードに対して異なるデータセットを分離することが実用的かどうか知りたいですか?

12
Googlebot

正規化のルールに当てはまる場合は、1:1の関係を正規化できます(定義により!)-つまり、1:1の関係について、正規の形式に従うことが不可能になるものはありません。

1対1の関係の実用性に関する質問に答えるために、これは、述語(列)が異なるサブタイプがある場合など、完全に有用な構成である場合があります。

1対1の関係を使用する理由は、視点によって異なります。 DBAはすべてをパフォーマンスの決定であると考える傾向があります。データモデラーとプログラマーは、これらの決定をデザインまたはモデル指向であると考える傾向があります。実際、これらの視点の間には多くの重複があります。それはあなたの視点と優先順位が何であるかに依存します。 1対1の関係の動機の例を以下に示します。

  • 非常に幅の広い列のサブセットがあり、パフォーマンス上の理由からそれらをストレージ内で物理的に分離したい場合。

  • 頻繁に読み取られたり更新されたりしない列のサブセットがあり、パフォーマンス上の理由から、それらを頻繁に使用される列から離しておく必要があります。

  • 一般にオプションの列がいくつかありますが、レコードが特定のタイプであることがわかっている場合は必須です。

  • サブタイプに論理的に属している列がいくつかあり、それらをモデル化して、コードのオブジェクトモデルにうまく適合させる必要があります。

  • エンティティスーパータイプの一部のサブタイプにのみ適用できる列がいくつかあり、スキーマで他のサブタイプにこのデータが存在しないようにする必要があります。

  • エンティティに属する列がいくつかありますが、より制限されたアクセスルール(従業員テーブルの給与など)を使用してこれらの特定の列を保護する必要があります。

ご覧のとおり、ドライバーはパフォーマンスである場合もあれば、モデルの純粋性である場合もありますが、宣言型スキーマルールを最大限に活用したいという欲求もあります。

19
Joel Brown

1対1のマッピングを使用して大きなテーブルを2つに分割する主な理由は、次のようなパフォーマンス上の理由です。

a)テーブルには、頻繁にアクセスされるテーブルにバイナリ/クローブ/ブロブデータがあり、大きな列は異なる方法で処理されるため、パフォーマンスが低下します。

b)テーブルにはさまざまなクエリによってアクセスされる多くの列があるため、パフォーマンスが低下するため、関連する列を別のテーブルに移動して、アクセスのパフォーマンスを向上させます。

ただし、多くの整数列があるからといって、テーブルを個別のテーブルに分割してクエリする必要があるという追加の努力が正当化されません。