Только один активный для каждого ограничения отношений - PullRequest
1 голос
/ 13 июня 2019

Так что у меня есть эта проблема с моим заданием.У меня есть две сущности: Order, Gifr_cupon.У меня есть две таблицы: Orders, Gift_Cupons.

Каждый заказ может иметь много купонов или ни одного.Каждый Cupon связан ни с одним, ни с одним заказом.Но только один купон может быть активным для каждого заказа.

Как применить это ограничение?

Вот логическое и ER-представление с DDL:

enter image description here enter image description here DLL:

CREATE TABLE gift_cupons (
cupon_id         INTEGER NOT NULL,
order_order_id   INTEGER,
active           INTEGER NOT NULL
);

ALTER TABLE gift_cupons ADD CONSTRAINT gift_cupon_pk PRIMARY KEY ( cupon_id 
);
ALTER TABLE gift_cupons ADD CHECK gift_cupon_check CHECK(active IS NULL OR ( active >= 0 AND active <=1 ) );

CREATE TABLE orders (
order_id INTEGER NOT NULL
);

ALTER TABLE orders ADD CONSTRAINT order_pk PRIMARY KEY ( order_id );

ALTER TABLE gift_cupons
ADD CONSTRAINT gift_cupon_order_fk FOREIGN KEY ( order_order_id )
    REFERENCES orders ( order_id );

Ответы [ 2 ]

2 голосов
/ 13 июня 2019

Вид

Cupon - is bound to -> Order;
Order - has active -> Cupon;

Cupon (
Id PK,
orderId FK Order.Id,
Unique ( Id, orderId) -- any superset  of PK is unique
);

Order (
Id PK
ActiveCuponId,
(Id, ActiveCuponId) FK Cupon( OrderId, Id)
);

См. Скрипку https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=596b30905d02a9e5c799b16da5fff5ab

1 голос
/ 13 июня 2019

Удалите столбец ACTIVE из таблицы gift_cupons и замените это состояние внешним ключом в таблице orders, например:

CREATE TABLE gift_cupons (
cupon_id         INTEGER NOT NULL,
order_order_id   INTEGER,
);

ALTER TABLE gift_cupons ADD CONSTRAINT gift_cupon_pk PRIMARY KEY ( cupon_id 
);

CREATE TABLE orders (
order_id INTEGER NOT NULL
active_cupon INTEGER -- nullable
);

ALTER TABLE orders ADD CONSTRAINT order_pk PRIMARY KEY ( order_id );

ALTER TABLE gift_cupons
ADD CONSTRAINT gift_cupon_order_fk FOREIGN KEY ( order_order_id )
    REFERENCES orders ( order_id );

alter table orders
add constraint order_active_cupon_fk foreign key (active_cupon)
    references gift_cupons (cupon_id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...