【问题标题】:One to many relationship table一对多关系表
【发布时间】:2014-05-19 06:05:34
【问题描述】:

有两个实体,其中一个是弱实体,它们之间的关系是一对多的。马厩可以有很多单元格,但必须至少有一个,并且单元格必须只有一个马厩。

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
);

如何确保马厩至少有一个细胞?

【问题讨论】:

  • 你试过亲子关系吗?
  • 将 stable_id 添加到 Cell 表中。然后,您可以为单个稳定实体创建多个 Cell。

标签: sql database postgresql entity-relationship


【解决方案1】:

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

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

  1. 插入stables后,验证是否存在具有相关stablenr的cell。

  2. 更新cell (stablenr) 并删除单元格后,验证是否仍有一个带有旧stablenr 的单元格稳定不再存在。

在每种情况下,请确保触发 deferrable initially deferred,否则您将无法插入、更新或删除开始的行。

话虽如此,我建议不要这样做。在现实生活中,您的马厩可能正在建设中,细胞可能在附近并且不可用,马厩可能没有细胞,只有一个场,亚达亚达,或者更简单地说,您可能知道马厩但不知道其中的细胞数量在数据输入期间。关键是,可能会出现许多违反此约束的丰富多彩的场景。

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

【讨论】:

    【解决方案2】:

    我做了这个触发器,它可以正常工作。我没有使用 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();
    

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

    【讨论】:

    • 这:它不包括单元格被删除或它的 stablenr 被更新为其他内容的情况。您在上面所做的在实践中并不实用,因为它也可能是事务的一部分,您可能希望插入的不仅是一个单元格,而是多个单元格:然后您需要获取现有单元格,如果需要更新它, 并插入其他的...而不是简单地插入它们。
    • 我只是将 ON UPDATE CASCADE 添加到 CELL 表中。而且我会考虑不删除最后一个单元格的 smth :) 这是一个分配,如果它不是最有效的方法,它就可以了。也许您可以向我展示如何编写一个函数/触发器以不删除马厩中剩余的一个单元格,或者可能有另一种方法来限制这一点?在那种情况下,我需要删除马厩。
    猜你喜欢
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 2021-07-11
    相关资源
    最近更新 更多