1

1対1の関係の作成に関するSOに関するいくつかの投稿を読みました。

SQLServerで実際の1対1の関係を作成するにはどうすればよいですか

データベース11の関係を使用することが理にかなっている時期はありますか?

データベース設計1対1の関係

しかし、この基本的なケースについてアドバイスをいただければ幸いです。私にはUSERテーブルとCOMPANYテーブルがあります。各ユーザーは0または1つの会社を持つことができます。

次の関係を持つ2つのテーブルを使用する方がよいでしょうか。

USER_COMPANY

関係

または、必要なすべてのフィールドを含む1つのテーブルのみを使用する必要がありましたか?

ユーザー

説明ありがとうございます。

注:私はSQL Server(Manager Studioを使用してセットアップ)を使用しており、EFを使用する予定です。

更新:より明確にするために、私が達成しようとしていることは次のとおりです。ユーザーは会社を所有できる場合と所有していない場合があります。彼が会社を所有している場合、彼はそれのために働いている唯一の人です。

ありがとう

4

5 に答える 5

3

ユーザーが会社を所有していない可能性があるため、これは真の「1 対 1」の関係ではありません。

実際、これは「1 から 0..1」であり、次の 2 つの方法のいずれかでモデル化できます。

  1. すべてを 1 つのテーブルにまとめる:

    ここに画像の説明を入力

    COMPANY_ID が UNIQUE (複数のユーザーが同じ会社を所有するのを防ぐ) であり、NULL 可能 (会社を所有していないユーザーを許可する) であることに注意してください。USER_ID と COMPANY_ID の分離により、会社レベルの外部キーが可能になります (つまり、子テーブルは会社を参照できますが、会社のないユーザーを参照することはできません)。

    会社レベルの FK がない場合は、COMPANY_ID を完全に省略できます。

    COMPANY_ID が設定されていない限り (または、少なくとも会社フィールドの正しいサブセットが非 NULL でない限り)、他の会社フィールドを設定できないようにするための CHECK も必要です。

  2. 2 つのテーブルを用意します。

    ここに画像の説明を入力

    これら 2 つのテーブルの PK を (両方向の) FK にすることはできません。MS SQL Server は、新しいデータを挿入するときに鶏が先か卵が先かという問題を解決するために必要な遅延制約をサポートしていないためです。 「1対0..1」の関係を正しくモデル化します(「1対1」をモデル化し、会社のないユーザーを許可しません)。

これら 2 つの戦略のどちらを選択するかは、ユーザー数と比較した企業数に大きく依存します。

  • ほとんどのユーザーが会社を所有している場合は、(1) を選択します。
  • 企業よりも利用者が多い場合は、(2)を選択してください。
于 2012-08-23T21:31:55.320 に答える
1

これは実際には多対多の関係のように思えます。

  • 複数のユーザーが会社で働くことができます
  • ユーザーは複数の会社で働くことができます

後者のケースを説明したくないかもしれませんが、私は傷つけることはできません. その場合、userテーブル、user_companyテーブル (n 対 n マッピング)、およびcompanyテーブルがあります。ユーザーを 1 つの会社に限定する場合は、テーブルuser_id内の列を一意にします。user_company

うまくいけば、それは役に立ちます。

于 2012-08-23T20:25:15.653 に答える
0

うーん、ユーザーごとに複数の会社を持つ必要がなく、大部分のユーザーが会社を持っていて、会社を説明するフィールドがそれほど多くない場合は、単純にして 1 つのテーブルを使用します。 . 後でいつでも変更できます。

もう少しスコープ 1 を多くしたい場合は、userid を company に入れるか、companyid を user に入れます。オプション 1 として持っているものは機能せず、信じられないほど混乱するコードにもつながります。

Select Company From Companies Where CompanyID = @UserID;// huh eh? What!!

そして、他の人が言ったように、さらに多くのスコープが必要な場合は、多対多を実行できるようにするには、CompanyID と UserID を含む 3 番目のテーブルが必要になります。

于 2012-08-23T21:45:12.220 に答える
0

それは、他にどのようなデータを取得するかによって異なります。これが会社が使用される唯一の場所である場合は、1 つのテーブルでそれを選択します。会社が他のいくつかのテーブルで使用されている場合は、別のテーブルにする必要があります。

于 2012-08-23T20:24:57.390 に答える
0

最初のオプションが最適です。

  • インデックス作成...パフォーマンス...
  • ユーザーが企業でない場合...
  • 会社を戻さずにユーザーにクエリを実行したい場合...
  • ...またはその逆
  • ユーザーにリンクする必要があるが、会社にはリンクする必要がない他のテーブルがある場合...
  • 別の方法でテーブルを保護できるようにしたい場合 (おそらく、購買部門は会社への SELECT アクセスが必要ですが、ユーザーは必要ありません。人事部門はユーザーへのアクセスが必要ですが、会社へのアクセスは必要ありません)...

100 万の理由がありますが、ここでは考えるべき 5 つまたは 6 つの理由を紹介します。

于 2012-08-23T20:29:54.247 に答える