1

私はすぐにデータベース設計の内外を学習しています (1 週間前の時点では、私にとっては初めてのことでした) が、すぐには明らかではないいくつかの質問に出くわしているので、明確にすることを望んでいました。 .

私が正しい質問は、外部キーに関するものです。設計の一部として、Companyテーブルがあります。もともと、アドレス情報をテーブル内に直接含めていましたが、3NF を実現することを望んでいたため、アドレス情報を独自のテーブルAddressに分割しました。データの整合性を維持するために、INT として「addressId」という名前の行をCompanyに作成しました。Addressテーブルには、対応する addressId が主キーとして含まれています。

私が少し混乱しているのは (または、正しく行っていることを確認したいこと)、どのテーブルをマスター (参照) テーブルにするか、どのテーブルを子 (参照) テーブルにするかを決定することです。最初にこれを設定したとき、Addressテーブルをマスターに、Companyを子にしました。ただし、会社ごとに 1 つのアドレスしか存在しないはずであり、会社の行が削除された場合は、対応するアドレスも削除 (CASCADE 削除) する必要があるため、これは間違っていると考えています。

私はこれに完全に間違ったアプローチをしている可能性があるため、外部キーを使用するときにテーブル間の関係をどのように考えるのが最善かについての良い経験則をいただければ幸いです。ありがとう!

4

4 に答える 4

2

会社に住所が 1 つだけある場合は、会社情報を Company テーブルに残すか、Address テーブルに CompanyId 列を設定しますが、あまり有用ではないようです。データが会社に本当に関連しており、他の場所で使用されていない場合でも、データをそこに置くことは 3NF です。

「請求先住所」と「配送先住所」を指定したい場合は、ID 列である AddressId と会社を参照する CompanyId 列とは別の住所テーブルを用意する方がはるかに理にかなっています。テーブル。

ただし、より一般的なルールを与えるために、「マスター」はデータの真の「マスター」です。この場合、マスター レコードは会社であるため、その ID を参照する必要があります。住所を持つ前に、会社を持つ必要があります。

于 2010-05-11T15:19:27.797 に答える
2

has or has manyリレーションシップと考えてください。会社には間違いなく住所あります(あなたの例では)ので、それは親テーブルであり、住所テーブルは会社テーブルを参照する必要があります。一方、多くの異なる会社が同じアドレスを共有している場合は、逆になる可能性があります。そのため、ニーズ (モデル化しようとしているロジック) にも依存します。

于 2010-05-11T15:20:28.223 に答える
1

会社を削除するたびに住所を削除したい場合、これは、住所が会社に直接依存していることを意味し、住所を会社テーブルに保持することは3NF.

アドレス属性が会社以外のものに依存している場合は、それらをアドレス テーブルに配置して、アドレス管理をより論理的に一貫させることができます。

たとえば、住所をcountry / region / town / streetいくつかの部分に分割し、会社の国の一部が独立した場合などに、分割されcountryた地域のフィールドを変更するだけで住所を変更できます。

ただし、これは、属性ではなくエンティティのようにアドレスに関心があることを意味し、それらをカスケード削除しないでください。

アップデート:

通常形の定義では、「従属」という言葉は「私のモデルでは従属」を意味します。

たとえば、会社の住所はWall Street, New York, NY, USAです。

モデル Wall Streetが に依存し、New Yorkに依存している場合、それを単一のテーブルに保持すると、 に違反します。NYUSA3NF

ただし、モデル内の場合:

  • Wall Street, New York, CA, USA有効なアドレスです (つまり、このアドレスでエラーが発生することはありません)

  • 他の会社に同じことをしているという理由だけで、会社の住所を更新することは決して有効な状況ではありません(これは、通りの名前変更や地域の統合、その他の地理的更新の処理などは、その一部ではないことを意味します)。通常のビジネスルール)

の場合、アドレスの表は にあります3NF

会社を削除するたびにアドレスを削除したいというあなたの希望から、アドレスの依存関係を追跡するつもりはないと判断し、したがって、会社のテーブルにアドレスを保持することができます。

于 2010-05-11T15:19:25.480 に答える
0

あなたはこれを正しく行っていません。company テーブルの addressid ではなく、address テーブルに company Id が必要です。これは、関係が実際には 1 対多、1 つの会社、複数の可能なアドレスであるためです (会社は多くの場合、複数のアドレスを持っています)。これにより、会社が親テーブルになります。

于 2010-05-11T15:19:35.730 に答える