2013-12-14 260 views
0

我的后续设计是否会出现问题?基本上,我想跟踪一个客户的总支付额(例如50美元),这个支付额分为两个项目(例如20美元和30美元)。但我希望能够查看任何项目 - ITEM(ITEM_ID),并知道客户在其总计帐单 - 付款(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) 
); 

首先,每个项目都是独一无二的(所以你不能对同一项目两笔款项)。 显然,如果客户在一次交易中支付了很多物品,我的付款表中将会有很多列(但这在30年内通常不会发生,通常是1次,偶尔也会发生2次或3次)。

有没有我没有看到的主要缺陷,或者可以改进吗?

回答

2

这是一个简单的一对多关系。您应该取出PAYMENT表中的ITEM_1和ITEM_2列和关联的外键。这些项目都通过ITEM表中的外键链接到他们的付款。这就是你需要的。

+0

非常感谢!试图创建一个简单的程序。如果我能加入,你会投票给你:) – Viet

+0

你应该仍然可以[接受答案](http://meta.stackoverflow.com/help/someone-answers) –

+0

只是做了。不得不谷歌找出如何做到这一点(必须等待15分钟后嘿嘿) – Viet