2015-04-23 3 views
1

У меня есть база данных с большим количеством таблиц, 4 из которых являются этиПроектирование баз данных третьего нормальная форма

  1. оплаты
  2. Кредитные карты
  3. Paypal
  4. Bitcoin

атрибуты кредитной карты :

  • CardID (PK)
  • типа
  • номер
  • EXPIREDATE
  • ...

PayPal атрибуты:

  • paypalID (PK)
  • счет
  • ...

Bitcoin атрибуты:

  • bitcoinID (PK)
  • ...

оплаты Таблица атрибутов:

  • количество
  • ...
  • ...
  • CardID (FK)
  • paypalID (FK)
  • bitcoinID (FK)

Платеж может быть оплачен только либо карта/PayPal/Bitcoin, так что я нарушение 3-й нормальная форма, потому что, если клиент использует карту, я знаю, что он не использовал paypal или биткойн. Как я могу исправить это, чтобы не нарушать 3-ей нормальную форму.

+0

Каждая сделка PayPal является оплата, но не каждый платеж сделка PayPal. Таким образом, таблица PayPal должна ссылаться на соответствующий платеж, а не наоборот. – IMSoP

+0

Дело в том, что я храню там информацию о PayPal, карточке и биткойне, потому что платежи повторяются или ежемесячные платежи. Таким образом, информация о платежной системе, которую я храню, не является транзакцией, это просто информация, необходимая для совершения транзакции. (надеюсь, что имеет смысл) –

+0

О, я вижу, я неправильно понял. – IMSoP

ответ

1

полностью чистый способ сделать это сегодня в 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».

Смежные вопросы