初心者のような質問で申し訳ありませんが、データベース内のテーブルと 1 対 1 の関係を使用する必要があるのでしょうか? 必要なフィールドはすべて 1 つのテーブル内に実装できます。データが非常に大きくなっても、SELECT
を使用する代わりに、ステートメントで必要な列名を列挙できますSELECT *
。この分離が本当に必要なのはいつですか?
ベストアンサー1
1から0..1
スーパークラスとサブクラス間の「1対0..1」は、「すべてのクラスを別々のテーブルに」戦略の一部として使用されます。継承の実装。
「1対0..1」は、NULL可能なフィールドでカバーされた「0..1」部分を持つ単一のテーブルで表現できます。ただし、関係がたいてい「1 対 0」で「1 対 1」の行が少数しかない場合、「0..1」の部分を別のテーブルに分割すると、ストレージ (およびキャッシュ パフォーマンス) を節約できる可能性があります。一部のデータベースは他のデータベースよりも NULL の保存に節約効果が高いため、この戦略が実行可能になる「カットオフ ポイント」は大きく異なる場合があります。
1対1
実際の「1対1」はデータを垂直に分割するため、キャッシュに影響する可能性があります。データベースは通常、個々のフィールドのレベルではなくページレベルでキャッシュを実装するため、行からいくつかのフィールドのみを選択した場合でも、通常はその行が属するページ全体がキャッシュされます。行の幅が非常に広く、選択したフィールドが比較的狭い場合、実際には必要のない多くの情報をキャッシュすることになります。このような状況では、データを垂直に分割すると便利です。のみより狭く、より頻繁に使用される部分または行がキャッシュされるため、より多くの部分がキャッシュに収まり、キャッシュが実質的に「大きくなる」ことになります。
垂直分割のもう 1 つの用途は、ロック動作を変更することです。データベースは通常、個々のフィールド レベルではロックできず、行全体のみがロックされます。行を分割すると、行の半分のみにロックがかかるようになります。
トリガーも通常はテーブル固有です。理論的にはテーブルを 1 つだけ用意して、トリガーで行の「間違った半分」を無視することもできますが、データベースによってはトリガーで実行できることと実行できないことについて追加の制限が課せられる場合があり、これが非現実的になることがあります。たとえば、Oracle では変更テーブルを変更できません。テーブルを別々に用意することで、変更できるのはそのうちの 1 つだけになり、トリガーからもう 1 つを変更することができます。
個別のテーブルを使用すると、よりきめ細かいセキュリティを実現できます。
これらの考慮事項はほとんどの場合無関係なので、ほとんどの場合、「1 対 1」テーブルを 1 つのテーブルに結合することを検討する必要があります。