2

この質問は別のRDBMSMySQLとに当てはまりますSQL Server

私はこれを一晩中探していましたが、ネット上で見つけることができません。私の問題は、一意性外部キーに関するものです。次のスキーマについて考えてみます。

CREATE TABLE Male
(
    StudentID INT,
    FirstName VARCHAR(20) NOT NULL,
    MiddleName VARCHAR(20) NOT NULL,
    LastName VARCHAR(20) NOT NULL,
    -- other columns ...
    CONSTRAINT male_PK PRIMARY KEY (StudentID),
    CONSTRAINT male_UQ UNIQUE (FirstName, MiddleName, LastName)
);

CREATE TABLE Female
(
    StudentID INT,
    FirstName VARCHAR(20) NOT NULL,
    MiddleName VARCHAR(20) NOT NULL,
    LastName VARCHAR(20) NOT NULL,
    -- other columns ...
    CONSTRAINT Female_PK PRIMARY KEY (StudentID),
    CONSTRAINT Female_UQ UNIQUE (FirstName, MiddleName, LastName)
);

CREATE TABLE ClassList
(
    ClassID INT,
    Name VARCHAR(30),
    ClassYear INT,
    -- other columns ...
    CONSTRAINT ClassList_PK PRIMARY KEY (ClassID),
    CONSTRAINT ClassList_UQ UNIQUE (Name, ClassYear)
);

テーブルMaleFemaleが分離されている理由は、それらが異なるSQLアカウントによって維持されているためです。


現在の問題は、アソシエーションクラスです。

CREATE Student_Class
(
    SudentID INT,
    ClassID INT,
    CONSTRAINT tb_UQ UNIQUE (StudentID, ClassID)
)

だから私の質問は:

  • StudentIDテーブルMaleとの両方からの一意性を設定するにはどうすればよいですかFemale。ネットでは見つかりません。
  • アソシエーションクラステーブルの値列が2つのForeign Keyテーブルから来るという制約を適用するにはどうすればよいですか?MaleFemale

提案も受け付けています。

ありがとうございました

4

3 に答える 3

2

これが属性分割が悪い理由です-それは奇妙な方法で他のテーブルに「感染」し始めます。

あなたが持つことができます:

CREATE Student_Class
(
    MaleStudentID INT NULL,
    FemaleStudentID INT NULL,
    ClassID INT NOT NULL,
    CONSTRAINT tb_UQ UNIQUE (MaleStudentID, FemaleStudentID, ClassID)
)

MySQLは、私が知る限り、CHECK制約をサポートしていないため、1つだけを保証するトリガーを作成する必要がMaleStudentIDありFemaleStudentIDますNOT NULL

これで、外部キー制約を明白な方法で適用できます。


SQL Serverの場合、チェック制約があります

ALTER TABLE Student_Class ADD CONSTRAINT CK_Students_Nullability CHECK (
    (MaleStudentID is null and FemaleStudentID is not null) or
    (MaleStudentID is not null and FemaleStudentID is null)
)
于 2013-01-22T07:28:44.630 に答える
1

あなたはできる:

StudentIDの範囲を設定して、男性/女性を識別します。たとえば、男性の場合は10000〜19999、女性の場合は20000〜29999です。

または、両方のテーブルに冗長列「Sex」を追加して、Mを男性、Fを女性にして、その部分を参照にすることもできます。

ラージ

于 2013-01-22T06:59:25.877 に答える
1

ユーザー権限でスキーマを指定できるようにするのは良い考えではないと思いますが、そうする必要がある場合は、HerpaMoTeHで言及されている考えは良い考えだと思います。id、gender、および性別固有のテーブルとstudent_classでFKとして使用されるidを持つ3番目のテーブル。

もう1つの解決策は、student_classテーブルをmale_student_classとfemale_student_classの2つに分割することです。

または、1つの学生テーブルでCRUD操作用の2セットのストアドプロシージャ(男性と女性)を作成することもできます。次に、ユーザーの実際のテーブルに対する特権を拒否しますが、適切なストアドプロシージャのセットへのアクセスをユーザーに許可します。スキーマは次のように簡略化されます。

CREATE TABLE Student
(
    StudentID INT,
    GenderId INT,
    FirstName VARCHAR(20) NOT NULL,
    MiddleName VARCHAR(20) NOT NULL,
    LastName VARCHAR(20) NOT NULL,
    -- other columns ...

);


CREATE Student_Class
(
   SudentID INT,
   ClassID INT,
  CONSTRAINT tb_UQ UNIQUE (StudentID, ClassID)
)
于 2013-01-22T07:21:09.873 に答える