Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database design 订单行应该引用产品还是仅仅具有产品名称属性?_Database Design_Domain Model - Fatal编程技术网

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

Database design 订单行应该引用产品还是仅仅具有产品名称属性?,database-design,domain-model,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 Or

在对订单进行建模时,在订单行中为产品设置属性是否有帮助,还是只需要产品名称

命令:

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;}
}
这样,如果我删除一个产品,它要么需要级联删除订单行和订单(这将非常糟糕),要么我
软删除
,并在产品上设置
IsDeleted
标志

当然,在域模型中存在这种关系是有帮助的;因此,从订单中,我可以访问它的订单行,然后进入每一行的产品,并访问产品的所有属性。但由于订单行具有价格、数量属性,这种对产品的依赖似乎弊大于利。如果我更改订单行,使其仅包含产品名称(在下面的类中,我已将类型从
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;}
}

这真的取决于你的情况。如果你需要删除订单行,如果订单被删除,那么通过引用是正确的。我会通过引用来做。它简单快速,而不是通过订单名获取订单,这是一个额外的步骤。我甚至不知道订单行与订单有何不同。我认为应该只有一个订单,con稠密。如果用sql保存,则使用外键标识,如果所有操作都用c#完成,则参考即可。

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

如果内存不足erves,像Dynamics GP这样成熟的销售系统可以做到这两个方面。你需要知道产品在订购时的状态;但是能够将商品链接到原始产品也很有用。例如,对于任何给定的产品,你可能在某个时候需要编制购买该产品的客户列表。或者,如果当产品名称发生变化时,您可能需要能够确定产品“是什么”,以便于实现

也就是说,产品“是什么”不应该改变。已经订购的产品通常不应该被删除。但是,你最好也知道客户发票上的确切措辞、描述、定价等

在代码中,这是一个偏好问题,只要您在幕后实现了最佳实践。我建议在每个订单行上有两个完整的产品对象:

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;}
}

一个订单可能有许多项目,因此订单行是管理这些项目的一种方式。