用关系中的属性为子类建模的正确方法

本文关键字:建模 方法 子类 关系 属性 | 更新日期: 2023-09-27 18:21:20

我有一个具有Employer列表的Lawsuit类。有一项要求,名单上的雇主之一必须被设定为主要雇主。我想了两种方法来满足这个商业规则。

解决方案1

这是我当前的实现,我有一个MainEmployer,并且我在这个属性和Employers列表上存储相同的实体:

public class Lawsuit()
{
    public int Id { get; set; }
    public virtual Employer MainEmployer { get; set; }
    public virtual ICollection<Employer> Employers { get; set; }
}

解决方案2

我还可以创建一个中间类EmployerLawsuit,该类具有名为Main:的bool属性

public class LawsuitEmployer()
{
    public int Id { get; set; }
    public bool Main { get; set; }
    public virtual Employer Employer { get; set; }
    public virtual Lawsuit Lawsuit { get; set; }
}
public class Lawsuit()
{
    public int Id { get; set; }
    public virtual ICollection<EmployerLawsuit> Employers { get; set; }
}

考虑到结果数据库的性能(我使用的是实体框架)和SOLID的原则,这两种方法中哪一种更好?或者有更好的方法来建模这些实体吗?

用关系中的属性为子类建模的正确方法

我会坚持#1方法。它只是LawsuitEmployer之间的一对多/多对一关联。也就是说,在检索Lawsuit持久对象时,所谓的关联将作为SQL联接的一部分进行检索,此外,您不需要查询所有雇主来检查哪个雇主是主雇主

在面向对象编程方面,#1听起来更好,当使用O/RM映射到关系数据库或NoSQL数据库时,域将表现更好。

关于#2

实际上,#2听起来更像是以关系的方式设计域。它将是一个设计为可查询的域,而面向对象编程产生层次模型,这是用关联而不是使用标志或标识符来定义域实体关系来表达域的主要原因。

您不需要标志来将实体标记为主要雇主并为此实现层次结构。保持简单:设置整个MainEmployer关联并开始!