0

1 つの主キーと 1 つの外部キーを持つ従来の Employee - Employer テーブルを作成しました。外部キーはプライマリを参照するため、自己参照テーブルです。

CREATE TABLE Worker
(
    OIB NUMERIC(2,0),
    Name NVARCHAR(10),
    Surname NVARCHAR(20),
    DateOfEmployment DATETIME2 NOT NULL,
    Adress NVARCHAR(20),
    City NVARCHAR(10),
    SUPERIOR NUMERIC(2,0) UNIQUE,
    Constraint PK_Worker PRIMARY KEY(OIB),
    CONSTRAINT FK_Worker FOREIGN KEY (Superior) REFERENCES Worker(OIB)
);

すべての従業員のポイントを保持する必要がある 2 番目のテーブルは、次のように作成されます。

CREATE TABLE Point
(
    OIB_Worker NUMERIC(2,0) NOT NULL,
    OIB_Superior NUMERIC(2,0) NOT NULL,
    Pt_To_Worker tinyint,
    Pt_To_Superior tinyint,
    Month_ INT NOT NULL,
    Year_ INT NOT NULL,
    CONSTRAINT FK_Point_Worker FOREIGN KEY (OIB_Worker) References Worker(OIB),
    CONSTRAINT FK_Point_Worker_2 FOREIGN KEY (OIB_Superior) References Worker(Superior),
    CONSTRAINT PK_Point PRIMARY KEY(OIB_Worker,OIB_Superior,Month_,Year_)
);

すべての従業員の月ごとの成績を保存できるようにする必要があります。つまり、Worker.OIB 用と Worker.Superior 用の 2 つの外部キーがあります。また、列 Point.OIB_Worker、Point.OIB_superior、Point.Month_、および Point.Year_ で構成される複合主キーがあります。キーは、月に 1 回以上の成績の入力を無効にする必要があるため、複合型です。

私の質問は:

ポイントからワーカーへの外部キーを作成して、上司が複数の従業員を割り当てられるようにする方法は?

よく見ると、私の実装は機能しますが、マネージャーごとに従業員を 1 人しか持てません。これは、外部キーが他のテーブルの主列または一意の列を参照する必要があるためです。そして、私の Worker.Superior は UNIQUE であるため、一意の値のみを持つことができます (繰り返しはありません)。

この例は、新しいデータベースを作成する際の一般的な問題であるため、多くの人が興味深いと思うと思います。

4

2 に答える 2

0

FK_Point_Worker_2にもReferencesWorker(OIB)が必要であり、Worker.SuperiorからUNIQUE制約を削除する必要があると思います。そうすれば、上司に複数の労働者を割り当てることができます。

于 2013-03-18T18:47:15.783 に答える
0

考えてみてください。SUPERIOR に一意の制約があり、2 人の従業員が同じ SUPERIOR を持つことができない理由について混乱しています。それが一意の制約の機能です-重複を許可しません。

FK は、一意の列または列のみを参照できます。

References Worker (OIB) を持つ FK_Point_Worker_2 は、OIB が上司であることを保証しません。

Worker on (OIB, SUPERIOR) に一意の制約を追加し、SUPERIOR
の一意の制約を削除します。
OIB が一意であるため、常に一意になります。次に、複合 FK 関係を持ちます。

これは複合 FK 関係の例です

ALTER TABLE [dbo].[wfBchFolder]  WITH CHECK ADD  CONSTRAINT [FK_wfBchFolder_wfBch] FOREIGN KEY([wfID], [bchID])
REFERENCES [dbo].[WFbch] ([wfID], [ID])
GO
于 2013-03-18T19:21:38.700 に答える