0

我正在为治疗计划软件建模三个实体的层次结构。治疗基本上被理解为在数天内给予患者的多种药物。我希望能够以只写一次的方式在任何一天取消治疗(出于质量控制认证目的)。

这是一个具体的问题:可以将复合外键的一部分重用为另一个外键吗?在我的例子中,复合关键点从药物表到日程表,然后又指向治疗。治疗 id 包含在药物表的复合外键中,所以我可以使用它作为外键,使查询更容易?

表定义应该是这样的(在我的原始 SQL 技能中取模,我通常总是使用某种 ORM):

CREATE TABLE therapy (
    "id" INTEGER NOT NULL,
    "start" DATE NOT NULL,
    PRIMARY KEY (id)
);

CREATE TABLE day (
    "therapy_id" INTEGER NOT NULL,
    "day" INTEGER NOT NULL,
    "revision" INTEGER NOT NULL,
    "comment" TEXT;
    "cancelled" BOOLEAN NOT NULL;
    PRIMARY KEY (therapy_id, day, revision),
FOREIGN KEY(therapy_id) REFERENCES therapy (id)
);

CREATE TABLE medication (
    "id" INTEGER NOT NULL,
    "therapy_id" INTEGER NOT NULL,
    "day" INTEGER NOT NULL,
    "revision" INTEGER NOT NULL,
    "substance" VARCHAR(100) NOT NULL,
    "dosage" VARCHAR(50) NOT NULL,
    PRIMARY KEY (id),
FOREIGN KEY(therapy_id, day, revision) REFERENCES day (therapy_id, day, revision),
-- wondering if this is ok
    FOREIGN KEY(therapy_id) REFERENCES therapy (id)
);

请注意,从一天到药物的关系是一对多的,例如在第 3 天,我想给病人贴上布洛芬、扑热息痛、阿司匹林、磨碎的咖啡豆和 Jaegermeister 的致命混合物。

4

1 回答 1

1

这是你开始的。

CREATE TABLE medication (
    "id" INTEGER NOT NULL,               -- You don't need this.
    "therapy_id" INTEGER NOT NULL,
    "day" INTEGER NOT NULL,
    "revision" INTEGER NOT NULL,
    "substance" VARCHAR(100),
    "dosage" VARCHAR(50),
    PRIMARY KEY (id),                    -- Drop this.
    FOREIGN KEY(therapy_id, day, revision) 
        REFERENCES day (therapy_id, day, revision),  -- Ok, but should be PK.
    FOREIGN KEY(therapy_id) REFERENCES therapy (id) -- You don't need this.
);

“id”列没有任何用处,反而使您确信您不需要对真实键的唯一约束:{therapy_id, day, revision}。将“id”上的无用主键约束替换为 {therapy_id, day, revision} 上的主键约束。删除最后一个外键约束。您知道“therapy_id”将引用现有行,因为表“day”中的外键约束需要它。

这给我们留下了这个。

CREATE TABLE medication (
    "therapy_id" INTEGER NOT NULL,
    "day" INTEGER NOT NULL,
    "revision" INTEGER NOT NULL,
    "substance" VARCHAR(100),
    "dosage" VARCHAR(50),
    PRIMARY KEY (therapy_id, day, revision),
    FOREIGN KEY(therapy_id, day, revision) 
        REFERENCES day (therapy_id, day, revision)
);

“物质”和“剂量”是可以为空的,这让我很困扰。想一想。

于 2013-07-25T11:34:57.860 回答