0

私が設計しているデータベースにはemployeesテーブルがあります。複数のタイプの従業員が存在する可能性があり、そのうちの 1 つは医療関係の従業員です。データベースには、医療従事者とその能力との間の多対多の関係も記述する必要があります。

どの従業員が医療関係者であるかを指定することのみを目的としてmedical_employees、列のみを含むテーブルを作成しても問題ありませんか? id列には、テーブルidを参照する外部キー制約がありemployeesます。以下のコードは私の質問をより明確にするはずです:

/* Defines a generic employee */
CREATE TABLE employees (
    id      INT PRIMARY KEY AUTO_INCREMENT,
    name    VARCHAR(100) NOT NULL
);

/* Specifies which employees are medics */
CREATE TABLE medical_employees (
    id INT NOT NULL,
    FOREIGN KEY (id) references employees(id);
);

/* Specifies what competences a medic can have */
CREATE TABLE medical_competences (
    id     INT PRIMARY KEY AUTO_INCREMENT,
    name   VARCHAR(100) NOT NULL
);

/* A many-to-many relation between medical employees and
   their competences. */
CREATE TABLE medical_employees_competences (
    id             INT PRIMARY KEY AUTO_INCREMENT,
    medic_id       INT NOT NULL,
    competence_id  INT NOT NULL,
    FOREIGN KEY (medic_id) REFERENCES medical_employees(id),
    FOREIGN KEY (competence_id) REFERENCES medical_competences(id)
);
4

3 に答える 3

1

+1 @Rahul から回答します。別の方法として、employees テーブルに属性を作成します。そのデータ型にはバグがあるため、BIT は使用しませんが。BOOLEAN または TINYINT を使用してください。

しかし、2 番目のテーブルを作成する方法には、次の利点があります。 は、medical_employees_competences医療従事者のみを参照するように暗黙的に制限されています。そのテーブルにいない限り、誰かを参照することはできません。

その制約を提供する別の方法は、次の方法で外部キーを作成することです。

CREATE TABLE employees (
    id      INT PRIMARY KEY AUTO_INCREMENT,
    name    VARCHAR(100) NOT NULL
    IsMedical BOOLEAN DEFAULT 0,
    KEY (id, IsMedical)
);

/* A many-to-many relation between medical employees and
   their competences. */
CREATE TABLE medical_employees_competences (
    id             INT PRIMARY KEY AUTO_INCREMENT,
    IsMedical      BOOLEAN DEFAULT 1, /* only put 1 in this column */
    medic_id       INT NOT NULL,
    competence_id  INT NOT NULL,
    FOREIGN KEY (medic_id, IsMedical) REFERENCES medical_employees(id, IsMedical),
    FOREIGN KEY (competence_id) REFERENCES medical_competences(id)
);

これで、2 番目のテーブルを使用して医療関係者のみを参照できるという同じ制約を実現できます。

于 2014-11-27T21:12:48.330 に答える