「簡単な」質問がありますが、私は経験豊富なプログラマーではないので、何人かが言わなければならないことを聞きたいと思います。
たとえば、多くのテーブルを持つMyDb
というDbがあるとします。そのうちの2つはCompany
とAddress
です。
それらの間の関係は、会社が多くのアドレスを持つことができるということです(それぞれが1つのオフィスまたはsthに)
だから今私はそれについて考えていて、「デフォルト」アドレスがどのように実装されるべきか疑問に思っていました。
私は2つの異なるアプローチを想像します:
CompanyId
テーブルにフィールドDefault
およびAddress
(boolean/bit)を作成します。 Default
がtrueの場合、このエントリがデフォルトのアドレスです。CompanyId
にフィールドAddress
を作成します。AddressId
にCompany
を作成します。これは、実際のデフォルトアドレスを表します。これは私の特定の問題ではなく、いわば一般的な青写真です。
では、どちらがより良いアプローチなのでしょうか? 2
私には本当に醜いようです。 1
2つのデフォルトをtrueにしないようにするにはどうすればよいですか?私はコードではなく、DBを離れるだけでこれを実行します(フィールドに間違ったタイプを入力すると、sthと言うように?
通常、CompanyとAddressの間には、多対多の関係にあるジョイナーテーブルがあります。それをCompany_Addressと呼びましょう。
Company_Addressには、CompanyとAddressに関連するCompany_IdとAddress_Idがあります。また、追加の列があります。デフォルトのインジケーター。
CompanyテーブルとAddressテーブルには、デフォルトのインジケーターはありません。ジョイナテーブルには、必要に応じて他のフィールドを含めることもできます。会社のデフォルトアドレスを変更すると、必要に応じてジョイナーテーブルレコードが更新されます。
あなたの最初の例は完全に合理的です。アドレステーブルにdefault
フィールドがあるだけです。これは1対多の関係です。そして「アドレスのタイプ」はアドレステーブルの属性です。
1つの会社の複数のデフォルトアドレスを防止するようにスキーマを設計したい場合は、companyidとaddressidの2つのフィールドを持つCompanyAddressDefaultという3番目のテーブルを作成します。次に、companyidを主キーにします。
ここには本当に2つの関係があります。 Company -> Address
は1:nですが、Company -> Default Address
は1:1です。
1:n関係をモデル化する標準的な方法は、n側に外部キーを配置して1側を指すようにすることです。つまり、Address
テーブルにCompany id
列を配置します。あなたはすでにこれをやっています。
1:1の関係をモデル化する標準的な方法は、1つの側面の1つに外部キーを使用することです。 Company
はAddress
とCompany
の間のすべての関係で唯一の1であるため、Company
テーブルにDefault Address id
列を配置します。
「ジョイナー」テーブルを使用しても、スキーマがmustがデフォルトのアドレスであることを強制できないことに注意してください。それが大丈夫で、あなたがそれをよりきれいに感じるなら、それでそうです。ただし、ソリューション2で言及した「醜さ」は、新しいデフォルトアドレスを作成するときに2つのテーブルを更新する必要があったためだと思います。ジョイナーテーブルソリューションを使用して2つのテーブルも更新する必要があることに注意してください。とにかく2つのテーブルを更新する必要がある場合は、より強い制約とより少ない全体的なテーブルを使用したソリューションを使用することをお勧めします。