一对多关系表

时间:2014-05-18 14:36:53

标签: sql database postgresql entity-relationship

有两个实体,其中一个是弱实体,它们之间的关系是一对多。稳定可以有许多细胞,但必须至少有一个细胞,细胞必须只有一个稳定。

CREATE TABLE Stables
(
    StableNr   SERIAL       NOT NULL,
    Address    VARCHAR(25)  NOT NULL,
        ...
    PRIMARY KEY (StableNr),

);

CREATE TABLE Cell
(
    CellNr      SMALLINT NOT NULL,
    StableNr    SMALLINT NOT NULL,
    Spaces      SMALLINT NOT NULL,
        ...
    PRIMARY KEY (CellNr, StableNr),
    FOREIGN KEY (StableNr) REFERENCES Stables ON DELETE CASCADE
);

如何确保马厩至少有一个牢房?

2 个答案:

答案 0 :(得分:3)

您可以使用约束触发器强制执行此类操作:

http://www.postgresql.org/docs/current/static/sql-createtrigger.html

  1. 插入马厩后,确认是否存在具有相关stablenr的单元格。

  2. cell (stablenr)上进行更新后,在单元格上删除后,请确认仍有一个旧版stablenr 的单元格已不再存在。

  3. 在每种情况下,一定要制作触发器deferrable initially deferred,否则您将无法插入,更新或删除行开头。

    话虽如此,我建议不要这样做。在现实生活中,你的马厩可能正在建造中,细胞可能在周围并且不可用,稳定可能没有细胞,只有一个田地,yada yada,或更简单地你可能知道一个稳定但不是在内的细胞数量它在数据输入期间。重点是,可能会发生违反此约束的任何数量的彩色场景。

    通过不强制执行约束,您的架构和应用程序将获得灵活性。

答案 1 :(得分:0)

我做了这个触发器,它可以正常工作。我没有使用 deferrable initial deferred ,因为我并不完全理解它。制作新的稳定版时,它会自动插入一个新的单元格(CellNr 1,StableNr,Spaces 1)。

CREATE FUNCTION insertCell() RETURNS "trigger" AS $$
    BEGIN
        INSERT INTO cell VALUES (1, NEW.StableNr);
        RETURN NULL;
    END;
$$
LANGUAGE plpgsql;

CREATE TRIGGER CellForStables
    AFTER INSERT ON Stables
    FOR EACH ROW EXECUTE PROCEDURE insertCell();

它有效,但我错过了什么重要的东西吗?谢谢!