2013-12-14 3 views
0

Будет ли проблема с моим следующим дизайном? В принципе, я хочу отслеживать общий платеж клиента (например, $ 50), который делится между двумя пунктами (например, $ 20 и $ 30). Но я хочу посмотреть на любой предмет - ITEM (ITEM_ID) и узнать, сколько клиент потратил на свой всего счет - PAYMENT (PAYMENT_AMOUNT). Для простоты я включал минимальные столбцы:SQL Несколько внешних ключей, указывающих на тот же первичный ключ

CREATE TABLE ITEM (
    ITEM_ID   NUMBER(7,0)   NOT NULL, 
    ITEM_SALE_AMT  NUMBER(7,2)   NOT NULL, 
    PAYMENT_ID  NUMBER(7,0)   NOT NULL, 
    PRIMARY KEY (ITEM_ID), 
    FOREIGN KEY (PAYMENT_ID) REFERENCES PAYMENT(PAYMENT_ID) 
); 

CREATE TABLE PAYMENT (
    PAYMENT_ID  NUMBER(7,0)   NOT NULL, 
    PAYMENT_AMOUNT NUMBER(7,2)   NOT NULL, 
    ITEM_1   NUMBER(7,0)   , 
    ITEM_2   NUMBER(7,0)   , 
    PRIMARY KEY (PAYMENT_ID), 
    FOREIGN KEY (ITEM_1) REFERENCES ITEM(ITEM_ID), 
    FOREIGN KEY (ITEM_2) REFERENCES ITEM(ITEM_ID) 
); 

Во-первых, каждый элемент уникален (так что вы не можете иметь два платежа за тот же товар). Очевидно, что если клиент оплачивает много товаров за одну транзакцию, таблица PAYMENT будет иметь много столбцов (но это никогда не случалось через 30 лет, обычно 1, а иногда 2 или 3).

Есть ли главный недостаток, который я не вижу или это можно улучшить?

ответ

2

Это простое отношение «один ко многим». Вы должны вынуть столбцы ITEM_1 и ITEM_2 и связанные с ними внешние ключи в таблице PAYMENT. Все элементы связаны с их платежами через внешний ключ в таблице ITEM. Это все, что вам нужно.

+0

Большое спасибо! Просто пытаюсь создать простую программу. Проголосовал бы за вас, если бы мог, но просто присоединился :) – Viet

+0

Вы все равно сможете [принять ответ] (http://meta.stackoverflow.com/help/someone-answers) –

+0

yup просто сделал. пришлось google, чтобы узнать, как это сделать (должен ждать 15 минут после post hehe) – Viet

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