полностью чистый способ сделать это сегодня в SQL, потому что платформы SQL не поддерживают утверждения. (CREATE ASSERTION в стандартах SQL). Но вы можете создавать таблицы, чтобы поддерживать разумные ограничения, даже без поддержки утверждений.
Нажимайте атрибуты, которые являются общими для всех запланированных платежей «вверх» в таблицу «запланированные_платежи».
create table scheduled_payments (
pmt_id integer primary key,
pmt_amount numeric(14, 2) not null
check (pmt_amount > 0),
pmt_type char(1) not null
check (pmt_type in ('b', 'c', 'p')), -- (b)itcoin, (c)redit card, (p)aypal.
other_columns char(1) not null default 'x', -- Other columns common to all payment types.
unique (pmt_id, pmt_type)
);
-- Tables for Bitcoin and PayPal not shown, but they're very similar
-- to this table for credit cards.
create table credit_cards (
pmt_id integer primary key,
pmt_type char(1) not null default 'c'
check (pmt_type = 'c'),
foreign key (pmt_id, pmt_type)
references scheduled_payments (pmt_id, pmt_type),
other_columns char(1) not null default 'x' -- Other columns unique to credit cards.
);
В primary key
, not null
и check(...)
ограничения в «credit_cards» гарантию того, что каждая строка будет иметь номер платежа и идентификатор «с». Ограничение внешнего ключа гарантирует, что каждая строка в «credit_cards» будет ссылаться на строку «c» в «schedule_payments».
Каждая сделка PayPal является оплата, но не каждый платеж сделка PayPal. Таким образом, таблица PayPal должна ссылаться на соответствующий платеж, а не наоборот. – IMSoP
Дело в том, что я храню там информацию о PayPal, карточке и биткойне, потому что платежи повторяются или ежемесячные платежи. Таким образом, информация о платежной системе, которую я храню, не является транзакцией, это просто информация, необходимая для совершения транзакции. (надеюсь, что имеет смысл) –
О, я вижу, я неправильно понял. – IMSoP