web-dev-qa-db-ja.com

1:n関係の1つを「デフォルト」としてマークするにはどうすればよいですか?

「簡単な」質問がありますが、私は経験豊富なプログラマーではないので、何人かが言わなければならないことを聞きたいと思います。

たとえば、多くのテーブルを持つMyDbというDbがあるとします。そのうちの2つはCompanyAddressです。

それらの間の関係は、会社が多くのアドレスを持つことができるということです(それぞれが1つのオフィスまたはsthに)

だから今私はそれについて考えていて、「デフォルト」アドレスがどのように実装されるべきか疑問に思っていました。

私は2つの異なるアプローチを想像します:

  1. CompanyIdテーブルにフィールドDefaultおよびAddress(boolean/bit)を作成します。 Defaultがtrueの場合、このエントリがデフォルトのアドレスです。
  2. CompanyIdにフィールドAddressを作成します。AddressIdCompanyを作成します。これは、実際のデフォルトアドレスを表します。

これは私の特定の問題ではなく、いわば一般的な青写真です。

では、どちらがより良いアプローチなのでしょうか? 2私には本当に醜いようです。 1 2つのデフォルトをtrueにしないようにするにはどうすればよいですか?私はコードではなく、DBを離れるだけでこれを実行します(フィールドに間違ったタイプを入力すると、sthと言うように?

3
R. Gomez

通常、CompanyとAddressの間には、多対多の関係にあるジョイナーテーブルがあります。それをCompany_Addressと呼びましょう。

Company_Addressには、CompanyとAddressに関連するCompany_IdとAddress_Idがあります。また、追加の列があります。デフォルトのインジケーター。

CompanyテーブルとAddressテーブルには、デフォルトのインジケーターはありません。ジョイナテーブルには、必要に応じて他のフィールドを含めることもできます。会社のデフォルトアドレスを変更すると、必要に応じてジョイナーテーブルレコードが更新されます。

5
Jon Raynor

あなたの最初の例は完全に合理的です。アドレステーブルにdefaultフィールドがあるだけです。これは1対多の関係です。そして「アドレスのタイプ」はアドレステーブルの属性です。

1つの会社の複数のデフォルトアドレスを防止するようにスキーマを設計したい場合は、companyidとaddressidの2つのフィールドを持つCompanyAddressDefaultという3番目のテーブルを作成します。次に、companyidを主キーにします。

2
swdev

ここには本当に2つの関係があります。 Company -> Addressは1:nですが、Company -> Default Addressは1:1です。

1:n関係をモデル化する標準的な方法は、n側に外部キーを配置して1側を指すようにすることです。つまり、AddressテーブルにCompany id列を配置します。あなたはすでにこれをやっています。

1:1の関係をモデル化する標準的な方法は、1つの側面の1つに外部キーを使用することです。 CompanyAddressCompanyの間のすべての関係で唯一の1であるため、CompanyテーブルにDefault Address id列を配置します。

「ジョイナー」テーブルを使用しても、スキーマがmustがデフォルトのアドレスであることを強制できないことに注意してください。それが大丈夫で、あなたがそれをよりきれいに感じるなら、それでそうです。ただし、ソリューション2で言及した「醜さ」は、新しいデフォルトアドレスを作成するときに2つのテーブルを更新する必要があったためだと思います。ジョイナーテーブルソリューションを使用して2つのテーブルも更新する必要があることに注意してください。とにかく2つのテーブルを更新する必要がある場合は、より強い制約とより少ない全体的なテーブルを使用したソリューションを使用することをお勧めします。

1
Karl Bielefeldt