以下设计是否会出现问题?基本上,我希望跟踪客户的总付款(例如,50美元),该付款分为两个项目(例如,20美元和30美元)。但我希望能够查看任何项目 - ITEM(ITEM_ID),并了解客户在总计帐单上花费了多少 - 付款(PAYMENT_AMOUNT)。为了简单起见,我包含了最少的列:
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年)。
是否存在我未看到的重大缺陷或是否可以改进?
答案 0 :(得分:2)
这是一个简单的一对多关系。您应该从PAYMENT表中取出ITEM_1和ITEM_2列以及相关的外键。这些项目都通过ITEM表中的外键与其付款相关联。这就是你所需要的一切。