1. ホーム
  2. database

[解決済み] 1対1の関係はどのようなときに使うべきですか?

2022-09-26 03:37:41

質問

素朴な質問で申し訳ないのですが、データベースのテーブルと1対1の関係を使用する本当の必要性はあるのでしょうか?1つのテーブルの中に必要なフィールドをすべて実装することができます。たとえデータが非常に大きくなったとしても、必要なカラム名を SELECT ステートメントを使用する代わりに SELECT * . この分離が本当に必要なのはどのような場合でしょうか?

どのように解決するのですか?

1から0...1へ

  • スーパークラスとサブクラスの間の "1 to 0..1" は、"すべてのクラスを別々のテーブルで" 戦略の一部として、次のように使用されます。 継承の実装 .

  • 1 to 0..1" は、"0..1" の部分をNULL可能なフィールドでカバーした単一のテーブルで表現することが可能です。しかし、もし関係が ほとんどが 1 to 0"で、行数が少ない場合、0..1"の部分を別のテーブルに分割すると、ストレージ(およびキャッシュパフォーマンス)を節約できる可能性があります。データベースによっては、NULLの保存が他のデータベースよりも効率的であるため、この戦略が実行可能になるカットオフ ポイントはかなり異なる可能性があります。

1 から 1

  • 実際の "1 to 1" はデータを垂直に分割し、これはキャッシュに影響を与える可能性があります。データベースは通常、個々のフィールドのレベルではなく、ページ レベルでキャッシュを実装しているため、行からいくつかのフィールドのみを選択した場合でも、通常はその行が属するページ全体がキャッシュされます。行が非常に広く、選択されたフィールドが比較的狭い場合、実際には必要のない多くの情報をキャッシュしてしまうことになります。このような状況では、データを縦方向に分割するのが便利でしょう。 だけ より狭く、より頻繁に使用される部分または行だけがキャッシュされ、より多くのものがキャッシュに収まるので、キャッシュを効果的に大きくすることができます。

  • 垂直分割のもうひとつの用途は、ロック動作を変更することです。データベースは通常、個々のフィールドのレベルではロックできず、行全体がロックされます。データベースは通常、個々のフィールドのレベルでロックすることはできず、行全体をロックします。行を分割することにより、その半分にのみロックが行われることを許可することになります。

  • トリガはまた、一般的にテーブル固有です。理論的には、1つのテーブルを持ち、トリガが行の間違った半分を無視することができますが、いくつかのデータベースでは、トリガができること、できないことに追加の制限があり、実用的でない場合があります。例えば、Oracleは、変異しているテーブルを修正することを許しません - 別々のテーブルを持つことによって、それらのうちの1つだけが変異しているかもしれないので、トリガからまだ他のものを修正することができます。

  • 別々のテーブルを持つことで、よりきめ細かいセキュリティが可能になるかもしれません。

これらの考慮事項はほとんどの場合無関係なので、ほとんどの場合、"1 to 1" テーブルを単一のテーブルにマージすることを検討する必要があります。

も参照してください。 なぜデータベース設計で 1 対 1 の関係を使用するのですか?