数据库设计:两个具有相同列但外键不同的表

时间:2012-11-21 03:22:56

标签: database-design

我有一张原始表:

CREATE TABLE [dbo].[tblSalesOrderPayment]  
(  
    [PaymentID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,  
    [SalesOrderID] [int] NOT NULL,  
    [PaymentType] [int] NOT NULL,  
    [AmountPaid] [decimal](18, 2) NOT NULL,  
    [AmountTendered] [decimal](18, 2) NOT NULL,  
    [PaymentDate] [datetime] NOT NULL,  
    [Cashier] [int] NOT NULL,  
    [PaymentStatus] [bit] NOT NULL  
)

..我设计了另一个这样的表

CREATE TABLE [dbo].[tblReturnOrderPayment]  
(  
    [PaymentID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,  
    [ReturnOrderID] [int] NOT NULL,  
    [PaymentType] [tinyint] NOT NULL,  
    [AmountPaid] [decimal](18, 2) NOT NULL,  
    [AmountTendered] [decimal](18, 2) NOT NULL,  
    [PaymentDate] [datetime] NOT NULL,  
    [Cashier] [int] NOT NULL,  
    [PaymentStatus] [bit] NOT NULL  
)  

..正如您所看到的,它具有相同数量的列和类型,但它们具有不同的外键。 tblSalesOrderPayment具有来自tblSalesOrder的SalesOrderID,而tblReturnOrderPayment具有来自tblReturnOrder的ReturnOrderID。


  1. 一旦销售订单已经退回,所有付款细节都应转移到tblReturnOrderPayment,但我需要保留tblSalesOrderPayment的记录以供参考。
  2. 一旦销售订单退回,将来的付款将保存到tblReturnOrderPayment。
  3. 这些表的正确设计应该是什么?

1 个答案:

答案 0 :(得分:1)

在表设计级别,您应该询问这两个表是否包含相同类型(类)的数据。如果任一表中的一行引用同一类实体的实例,那么它们可能应该在同一个表中,并带有一个标志字段来说明它是否被返回。如果外键不属于给定行,则将其保留为空。

如果这两种行属于同一个类但属于不同的子类,那么您可以选择两种设计。这些被称为“单表继承”和“类表继承”。你可以在SO中查找相应的标签,或者你可以在网上找到文章。