订单行应该引用产品还是仅具有产品名称属性?

时间:2013-03-29 19:10:07

标签: database-design domain-model

对订单建模时,是否有必要在订单行中为产品设置属性,或者只需要产品名称?

订单:

public class Order 
{
    public Guid Id {get; set;}
    public DateTime OrderDate {get; set;}
    public Decimal Total {get;set;}
}

订单行:

public class Orderline
{
    public Guid Id {get; set;}
    public Order Order {get; set;}
    public Product Product {get; set;}
    public int Quantity {get; set;}
    public Decimal Price {get; set;}
}

如果我删除了一个产品,它将需要级联删除Orderline和Order(这将非常糟糕)或我soft delete并在Product上设置IsDeleted标志。

当然,在域模型中存在关系可能会有所帮助;所以从订单我可以访问它的订单行,然后进入产品的每一行,并访问产品的所有属性。但由于Orderline具有价格,数量的属性,因此对产品的这种依赖性似乎比它有所帮助。如果我更改了订单行,那么它只有产品的名称(在下面的类中我将类型从Product更改为String,那么我可以删除产品而不会影响任何记录:

public class Orderline
{
    public Guid Id {get; set;}
    public Order Order {get; set;}
    public string Product {get; set;}
    public int Quantity {get; set;}
    public Decimal Price {get; set;}
}

3 个答案:

答案 0 :(得分:2)

我建议您只需将产品信息复制到订单行。产品有随时间变化的趋势,您真正想要的是客户在特定时间购买的产品的快照。

答案 1 :(得分:0)

这实际上取决于你的情况。如果您需要删除订单,如果订单被删除,则参考是正确的。我会通过参考来做到这一点。它简单而快速,而不是通过ordername获取订单,这是一个额外的步骤。我甚至不知道订单行如何与订单不同。我认为应该只有一个订单,凝聚。如果事情保存在sql中,请执行外键标识,如果所有内容都在c#中完成,则引用就可以了。

答案 2 :(得分:0)

如果内存服务,像Dynamics GP这样成熟的销售系统都可以。您需要知道订购时产品的状态;但是能够将订单项链接到原始产品也很有用。例如,对于任何给定的产品,您可能有时需要编制购买该产品的客户列表。或者,如果产品名称发生变化,您可能需要为了实现目的而确定产品“是什么”。

那说,产品“是”应该不会改变。通常不会删除已订购的产品。但是,理想情况下,您还要知道客户发票上的确切措辞,描述,定价等。

在代码中,只要您完成最佳实践,这是一个偏好问题。我建议在每个OrderLine上有两个完整的Product对象:

public class Orderline
{
    public Guid Id {get; set;}
    public Order Order {get; set;}
    public Product Product {get; set;}
    public Product OriginalProduct {get; set;}  // or "OriginatingProduct" or whatever
    public int Quantity {get; set;}
    public Decimal Price {get; set;}
}