3

まず、問題が発生している 3 つのテーブルのコードを次に示します。

    CREATE TABLE ProgramSupervisor
    (    EmpNo                                CHAR (6),
         ProgramSupervisorNo                  CHAR (6),
         TeamNo                               CHAR (3),
         CONSTRAINT PKProgramSupervisor PRIMARY KEY (EmpNo , ProgramSupervisorNo) ,
         CONSTRAINT FKProgSupEmpNo FOREIGN KEY (EmpNo) REFERENCES Employee  )

別:

    CREATE TABLE ISL
    (    ISLNo                                  CHAR (6) ,
         EmpNo                                  CHAR(6),
         ProgramSupervisorNo                    CHAR (6),
         ISLName                                VARCHAR (30),
         ISLStreet                              VARCHAR (40),
         ISLCity                                VARCHAR (30),
         ISLState                               CHAR (2),
         ISLZip                                 CHAR (5),
    CONSTRAINT PKISL PRIMARY KEY (ISLNo) ,
    CONSTRAINT FKISLProgSupNo FOREIGN KEY (ProgramSupervisorNo, EmpNo) 
               REFERENCES ProgramSupervisor  )

そしてもう一つ:

    CREATE TABLE Hourly
    (    EmpNo                           CHAR (6),
         ISLNo                           CHAR (3),
          NumberOfWriteUpes              SMALLINT,
    CONSTRAINT PKHourly PRIMARY KEY (EmpNo),
    CONSTRAINT FKEmpNo FOREIGN KEY (EmpNo) REFERENCES Employee,
    CONSTRAINT FKISLNo FOREIGN KEY (ISLNo) REFERENCES ISL  )

これがERDと私が目指している関係です:

ここに画像の説明を入力

情報が得られたので、私が抱えている問題について説明しましょう。まず、ERD は少し誤解を招きます。「Salary」親テーブルの子テーブルである ProgramSupervisor テーブルがあり、「Salary」は親テーブル「Employee」の子テーブルです。「従業員」の PK が EmpNo であるため、Salary の PK、次に ProgramSupervisor の PK も EmpNo です。ただし、ProgramSupervisorNo を「ProgramSupervisor」テーブルの PK にして、複合 PK を持たせたいと考えています。「ISL」テーブルを作成するときに、複合「ProgramSupervisor」PK を ISL テーブルの FK として参照するには、Access で両方の PK フィールド名が必要です。これは正規化基準に違反していませんか? 「ISL」テーブルに EmpNo と ProgramSupervisorNo の両方が必要なため、「しない」これは、ProgramSupervisorNo が EmpNo に依存しているため、フィールドの 1 つを含めるべきではないということですか? 私はこれに慣れていないので、私の手抜きな説明を許してください。

また、'Hourly' 従業員は 1 つの ISL に属し、ISL は多数の 'Hourly' 従業員を持つことができますが、'Hourly' テーブルは Employee の子テーブルでもあり、主キーとして EmpNo を持ちます。そうは言っても、「ISL」テーブルに EmpNo と ProgramSupervisorNo を入力する必要がある場合、ISLNo を「時間別」テーブルに入力するにはどうすればよいですか?

泥のように透明?基本的に、各 ISL には ProgramSupervisor があるため、「ISL」テーブルに ProgramSupervisorNo を配置するだけです。次に、ISLNo を「時間別」テーブルに入れたいと思います。いくつかの例を示して、私が 5 歳のように説明してください。どんな助けでも大歓迎です。

4

1 に答える 1

3

学問的な観点からは、Primary key次のすべての点に適合する必要があります。

  • 個性的
  • 最小限の
  • すべての PK フィールドが null でない

外部キーは、他のテーブルの主キーへの参照です。そのため、参照される PK が持つフィールドを正確に含める必要があります。PK は (学術的な観点から) 最小でなければならないため、これは正規化に違反しません。

2 つ以上の列を持つ主キーがあり、その行を 1 つの列だけで参照するだけで十分だと思う場合、PK は最小ではないため有効ではありません。それが有効で、一意性を満たすためにこれらすべての列が必要な場合は、外部キーにもこれらすべての列が必要です。

DBMS では最小ではない PK を定義できますが、それはアカデミックな概念から離れるポイントです。

于 2013-11-10T22:22:15.483 に答える