0


1

すべてのエラーをチェックしました。主キー、一意性、および型です。 データベースにある2つのフィールドをリンクできないようです。 誰かが見てもらえますか?

ありがとう。

5 Answer


6


あなたの関係図はあなたがあなたの結合のためにIDフィールドをあなたの主キーにしたことを示しています、しかしあなたはそれらを使っていません。 したがって、彼らは全く目的を果たしません。 「代理キー」(つまり、データベースによって生成され、各レコードに固有の無意味なID番号ですが、テーブル内のデータに関してはまったく意味がありません)を使用しない場合は、それらを削除します。 。 しかし、「自然キー」(つまり、各レコードに対して一意となる一連の実データフィールドから構成される主キー)を使用する場合は、それらのフィールドに一意の複合インデックスを設定する必要があります。

ただし、両方のアプローチには問題があります。

  1. 代理キー:代理PKは各レコードを一意にします。 つまり、ID 1のDavid FentonのレコードとID 2のDavid Fentonのレコードがあります。 同じDavid Fentonであれば、データは重複していますが、データベースが認識している限り、それらは一意です。

  2. 自然キー:一部の種類のエンティティは自然キーと非常によく連携します。 そのような最善の方法は、レコードを一意に識別する単一のフィールドがある場合です。 例は「従業員タイプ」で、値は「仲間、上司など」です。その場合は、代理キーを追加するのではなく、自然キーを使用することをお勧めします。 その場合の自然キーに対する唯一の議論は、候補自然キーのデータが非常に不安定である(すなわち、頻繁に変わる)かどうかである。 最新のデータベースエンジンはすべて「CASCADE UPDATE」機能を提供しますが(つまり、PKフィールドの値が変わると、そのフィールドが外部キーであるすべてのテーブルが自動的に更新されます)、ある程度のオーバーヘッドが発生し、問題が生じる可能性があります。 単一列キーの場合は、問題になる可能性は低いです。 現在、ルックアップテーブルを除いて、自然キーが単一の列になるエンティティはほとんどありません。 代わりに、複合インデックス、つまり複数のデータフィールドにわたるインデックスを作成する必要があります。 Accessテーブルデザインのインデックスダイアログでは、最初の列に名前を付け、2番目の列に(テーブルのフィールドのドロップダウンリストから)複数の行を追加して、複合キーを作成します。 これの欠点はあなたの複合ユニークインデックスのフィールドのどれかが未知であるならば、あなたはユニークさを得られないということです。 つまり、あるフィールドの2つのレコードにNullがあり、残りのフィールドが同一である場合、NullがNullと等しくなることはないため、これは一意性の競合とは見なされません。 これは、Nullが「空」を意味するのではなく、「不明」を意味するためです。

Allen BrowneがNullsについて知る必要があるすべてを説明しています。

グラフィックでは、CompanyテーブルとPManagerテーブルをリンクしようとしていることがわかります。 後者のテーブルはCompanyIDフィールドを持ち、あなたのCompanyテーブルはそのIDフィールドにユニークなインデックスを持っているので、必要なのはCompanyテーブルのIDフィールドからPManagerテーブルのCompanyIDフィールドへのリンクだけです。 あなたの例がうまくいくためには(これはあなたがすでにIDフィールドにユニークなインデックスを持っているので役に立たないでしょう)、CompanyテーブルのIDとShortNameの両方にまたがるユニークな複合キーを作成する必要があるでしょう。

さらに、ShortNameが一意になりたいフィールドである(つまり、2つの会社レコードに同じShortNameを持たせたくない)場合は、IDフィールドをまだ使用しているかどうかにかかわらず、一意のインデックスを追加します。あなたの主キー。 これにより、上記の#1に戻ります。ここでは、代理キーによって一意性が確立されるため、代理キーを使用して重複レコードを入力する可能性がある状況について説明しました。 代理キーを使用する場合は常に、一意である必要があるデータフィールドの任意の組み合わせに一意の複合インデックスを追加する必要があります(項目2で概説されているNullフィールドに関する警告付き)。

「代理キーがより多くのインデックスを意味する」と思っているのであれば、同じテーブルに2つのユニークなインデックスがあるという意味で正しいと言えます(Null問題がないと仮定して)。 しかし、SQLでテーブルを結合することはかなり簡単であり、データの重複も大幅に少なくなります。 同様に、CASCADE UPDATEのオーバーヘッドを回避できます。 一方、自然な外部キーを持つ子テーブルを表示している場合、親レコードを識別するために親テーブルに結合する必要はありません。外部キーフィールド 特定のシナリオでは、結合の必要性がないことでパフォーマンスが大幅に向上する可能性があります(特に、外部キーがNULLになる可能性があるために外部結合が必要な場合)。

これは実際には非常に大きなトピックです、そしてそれは宗教的な議論のようなものです。 私はサロゲートキーキャンプにしっかりと所属していますが、ルックアップテーブルにはキーが1列の自然キーを使用します。 私は他の目的のために自然な鍵を使いません。 そうは言っても、可能であれば(つまり、Null問題がない場合)、私は自然キーに関する独自のインデックスもあります。

お役に立てれば。


5


実際には、両側に名前フィールドのインデックスが必要です

しかし、私はあなたがあまりにも多くの結合を持っていることを提案することができますか? 一般に、あるテーブルから次のテーブルへの結合は1つだけです。 テーブル間に複数の結合があることは稀であり、2つ以上の結合があることは非常にまれです。

このリンクを見てみましょう。

すべてのテーブルが単一の関係によってどのように結合されているかに注目してください。

PKと表示された各フィールドは主キーです。 これらはAUTONUMBERフィールドです。 FKというラベルの付いた各フィールドは外部キーです。 これらはInteger型のインデックス付きNumberフィールドです。 主キーは、1対多の関係で外部キーに接続されています(ほとんどの場合)。

99%の時間、あなたは他の種類の結合を必要としないでしょう。 トリックは固有の情報でテーブルを作成することです。 データベースにはたくさんの繰り返し情報があります。

このようにして再編成されたデータベースは、「正規化」データベースと呼ばれます。 http://www.databaseanswers.org/data_models/にこれらの良い例がたくさんあります。


0


CompanyIDに参加するだけです。 PManagerのCompanyフィールドも削除できます。


0


私は次のようにして問題を解決しました(アクセスにおける参照整合性の同じ問題に直面します)。

  1. Access to Excelで両方のテーブルからデータをエクスポートしました。 表1には、会社コードおよび会社に関する基本情報が含まれていました。 主キーとして顧客コード。

  2. Table2には、顧客がその会社に関連付けられている人物に関するすべての情報が含まれていました。

  3. ExcelにエクスポートされたTable2からすべての重複を削除しました。

  4. Vlookupを使用して確認したところ、Table 1にはない11の顧客コードがあることがわかりました。

  5. これらのコードをアクセステーブルに追加しました。 参照整合性によってリンクされ、問題は解決されました。

機能しない場合は、外部キーも探してください。


-2


あなたはINDEXを作成する必要があります。 おそらく、インデックス作成ボタンのようなものを探して、CompanyIDにインデックスを作成します。