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

Database design 数据库设计:两个列相同但外键不同的表,database-design,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,

我有一张原始的桌子:

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


  • 一旦销售订单已经返回,所有付款详细信息都应传输到tblReturnOrderPayment,但我需要保留tblSalesOrderPayment的记录以供参考
  • 一旦销售订单返回,未来的付款将保存到tblReturnOrderPayment
    这些表的正确设计应该是什么?

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


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

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

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