1

我有一个原始表:

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。

这些桌子的正确设计应该是什么?

4

1 回答 1

1

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

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

于 2012-11-21T12:09:39.893 回答