1対1の関係を凝縮しないことが理にかなっていますか?


12

テーブルBと1対1の関係を持つテーブルAがある場合、それらを離しておくことは意味がありますか?または、それらを単一のテーブルに結合しても害はありませんか?これらのシナリオ(2つのテーブルと1つの結合されたテーブル)のいずれかが、通常の形式(1NF、2NF、3NFなど)に関して何か影響を与えますか?


5
1対1または1対0または1を意味しますか?
jpmc26

回答:


30

はい、これがより良いデザインである理由はたくさんあります。

継承/拡張関係がある場合があります。たとえばUserAdministratorテーブルがあり、さらにフィールドがあるテーブルがあります。両方のテーブルにユーザーIDのプライマリキーがあります(したがって1:1の関係があります)が、すべてのユーザーがAdministratorテーブルにレコードを持つわけではありません。ScheduledTaskテーブルやCompletedTaskテーブルなど、ワークフローをサポートしている場合は、同様のものが必要になります。

一般的に使用されるデータ用に軽量のテーブルを作成しUser、あまり必要でない詳細用に大きなテーブルを作成することができますUserDetails。これにより、より多くのレコードを単一のデータページに収めることができるため、パフォーマンスが向上します。

あなたは、例えば、テーブルに異なるアクセス許可をすることができUser、およびUserCredentials

異なるバックアップ戦略が必要な場合、異なるパーティションに2つのテーブルを置くことができます。たとえばTransactionTransactionArchive

単一のテーブルでサポートできるよりも多くの列が必要になる場合があります。たとえば、インデックスを作成する必要がある大きなテキスト列が多数あり、DBプラットフォームが4Kデータページまたはwhathaveyouに制限されている場合です。


テーブルにデータベースシステムでサポートできる数より多くの列がある場合、設計上の問題があります。しかし、そうでなければ、あなたの答えは健全です。
ロバートハーベイ

2
同意しました...私は、それぞれの理由で編集するのではなく、網羅的なリストを目指しています。
ジョン・ウー

ワークフローの背景は何ですか?使用している特定のソフトウェアはありますか?独自のワークフローシステムを導入しましたか?
ロバートハーベイ

1
物理的=サーバーのパフォーマンス、ページサイズ、インデックス作成、クラスタリング、バックアップなどの物理的制約に関係します。いずれも論理設計に影響を与えません。純粋に論理的な観点から、単一のエンティティは、単一のテーブル内の単一のタプルまたは行として概念化される必要があります。
ジョン・ウー

4
リンク「1つの親レコードまたはフィールドに0または1つの子レコードのみがある場合、リレーショナルデータベースの1対1の関係が発生します。」
ジョン・ウー

6

もう1つの理由は、@ john-wuによる優れた答えに加えて、写真のようなBLOBタイプの列がある場合です。

そのBLOB列を別のテーブルに配置したいのは、ユーザーテーブルのクエリが高速であるだけでなく、BLOBを含むテーブルをより安価で低速のストレージ上の別のテーブルスペースに移動し、最もクエリされたデータをより高速なストレージ上のメインテーブルスペース。


3

1対1の関係は、表Bの関連レコードをオプションにする場合にのみ意味があります。

時々あなたが望むのはバリアントレコードですまたはTagged Unionです。つまり、異なる情報を含む複数のテーブルがありますが、それらはすべて1対1の関係でテーブルAに関連しています。次に、テーブルAのフィールドに基づいて、関連付けるテーブルを選択します

例えば:

type Transaction(The_Type: PaymentType := Cash) is record

    Amount: Integer;

    case The_Type is
        when Cash =>
            Discount: boolean;
        when Check =>
            CheckNumber: Positive;
        when Credit =>
            CardNumber: String(1..5);
            Expiration: String(1..5);
    end case;
end record;

オプションの場合、これはすべてが1つのテーブルにあり、必要な列を選択することとどのように異なりますか?
第29回Saltshaker

メインテーブルにこれらの追加フィールドが含まれていなくても、メインテーブルにこれらの追加フィールドがあるため、コストがかかります。バリアントレコードに複数のテーブルがある場合、1つのテーブルに100列ありますが、ほとんどの列はほとんど使用されません。
ロバートハーヴェイ

1

ビジネスモデリングでは、ビジネスの観点から論理的に分離されている2つのエンティティAとBは、通常、異なるテーブルにマッピングされます。

たとえば、オブジェクト指向の手段を使用してビジネスモデリングを行う場合、通常、何らかの種類のオブジェクトリレーショナルマッピングが用意されています。オブジェクトモデルから始めて、そこからリレーショナルモデルを派生させることができます。オブジェクトモデルでクラスAとクラスBを作成したとします。クラスAとBは、オブジェクトは1:1の対応関係を持っていますが、単一の責任原則のために分離されたままでなければなりません。オブジェクトモデルでは、これらのクラスは属性を持つ単なるテーブルではなく、メソッドに実装されたいくつかの動作を備えたビジネスオブジェクトを表す場合があります。そして、これらのクラスをリレーショナルモデルに簡単にマッピングすると、1対1の関係を持つ個別のテーブルAとBが得られます。

私の経験では、ビジネスまたはオブジェクト指向のデータモデルを作成する場合、この論理的な分離は、パフォーマンス、個別のセキュリティ、パーティション分割などの「物理的な」理由よりも1:1の関係のほうがはるかに一般的です。


あなたが意味するものの具体例を挙げていただけますか?
第29回Saltshaker
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.