Таблица отношений один ко многим

Есть две сущности, одна из которых является слабой сущностью, и отношения между ними - один ко многим. В конюшне может быть много ячеек, но должна быть хотя бы одна, и ячейка должна находиться только в одной конюшне.

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

Как сделать так, чтобы в конюшнях была хотя бы одна ячейка?


person user2879175    schedule 18.05.2014    source источник
comment
Вы пробовали отношения родитель-ребенок ??   -  person cracker    schedule 18.05.2014
comment
Добавьте стабильный_id в таблицу ячеек. Затем вы можете создать несколько ячеек для одного стабильного объекта.   -  person Sandeep    schedule 18.05.2014


Ответы (2)


Вы можете применить такие вещи с помощью триггеров ограничений:

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

  1. После вставки в конюшню убедитесь, что существует ячейка с соответствующим номером конюшни.

  2. После обновления в cell (stablenr) и после удаления в ячейке убедитесь, что все еще существует ячейка со старым stablenr или, что конюшня больше не существует.

В каждом случае обязательно сделайте триггеры deferrable initially deferred, иначе вы не сможете вставлять, обновлять или удалять строки с самого начала.

С учетом сказанного, я бы посоветовал не делать этого. В реальной жизни ваша конюшня может быть в стадии строительства, клетки могут быть вокруг и недоступны, в конюшне может не быть клеток, а только поле, бла-бла-бла, или, проще говоря, вы можете знать о конюшне, но не о количестве клеток внутри. это во время ввода данных. Дело в том, что может возникнуть любое количество красочных сценариев, которые нарушают это ограничение.

Не применяя ограничение, ваша схема и ваше приложение приобретут гибкость.

person Denis de Bernardy    schedule 18.05.2014

Я сделал этот триггер, и он работает как надо. Я не использовал deferrable first 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();

Это работает, но я пропустил что-то важное? Благодарю вас!

person user2879175    schedule 18.05.2014
comment
Это: это не распространяется на случай, когда ячейка удалена или ее стабильный номер обновлен на что-то другое. То, что вы сделали выше, на практике громоздко, поскольку оно также может быть частью транзакции, в которой вы можете захотеть вставить не одну, а несколько ячеек: тогда вам нужно будет получить существующую ячейку, обновить ее, если необходимо , и вставьте дополнительные... вместо того, чтобы просто вставлять их. - person Denis de Bernardy; 19.05.2014
comment
Я просто добавляю ON UPDATE CASCADE в таблицу CELL. И я придумаю что-нибудь, чтобы не удалять последнюю ячейку :) Это для задания, и это нормально, если это не самый эффективный способ. Может быть, вы могли бы показать мне, как написать функцию/триггер, чтобы не удалять одну оставшуюся ячейку в конюшнях, или, может быть, есть другой способ ограничить это? Мне нужно удалить конюшни в этой ситуации. - person user2879175; 19.05.2014