DDD建模问题:学生,教室,座位和学生最喜欢的座位

时间:2010-03-26 16:24:56

标签: domain-driven-design modeling

我不确定如何建立这种关系......

教室里有很多座位,每个学生都在教室里学习,并且里面有一个最喜欢的座位。

我看到它的方式,我有两个根源:课堂和学生,座位a是由教室聚集的实体......

如果学生有一个fovorite席位,它必须持有它(座位不是聚合根)。

有什么建议吗? 提前谢谢,Erik。

4 个答案:

答案 0 :(得分:0)

嗯,这取决于......我可能会有像你这样的座位。学生可以是实体,但座位看起来更像是价值对象。但是,所有这些都取决于您的背景。我不确定什么对你重要,如果我的建议没有意义,请解释你的背景。

答案 1 :(得分:0)

一个可能的选择是每个座位都有一个座位最喜欢的学生列表。课堂聚合根将负责维持学生不能在课堂上拥有多个最喜欢的座位的约束。使用此选项,座位是由教室汇总的实体(不是值对象),并且引用了学生。

答案 2 :(得分:0)

听起来你需要引入一个价值对象Location,它描述了教室中的一个位置,然后你可以在学生班中对它们进行建模:

public IDictionary<Classroom, Location> FavoriteSeats;

教室可以按其所在地引用Seat个实体。

(如果他们真的首先是实体 - 您甚至可能发现您不需要将座位建模为实体(例如,“蓝色塑料椅子,闻起来像汉堡包)”。 )

答案 3 :(得分:0)

OP之后的几个月,但以防它有用。

@Jeff Sternal正走在正确的轨道上。问题基本上是关于管理学生,教室和座位之间的三方(三元)关系。由于这是一个关系问题,让我们暂时保留关系概念,并称之为FavouriteSeat(学生,课堂,座位)。

如上所述,除了唯一标识符之外,该问题不需要任何关于它们的任何知识。现在让我们使用伪类型“ID”(并不重要,只要每个都是唯一的)。

在伪sql中,我们有:

create table FavouriteSeat(
   StudentID ID not null,
   ClassroomID ID not null,
   SeatID ID not null)

该表上的标准CRUD(创建/读取/更新/删除)操作提供了所需的所有操作。但是,它缺少一些限制。现在,学生可以在教室里拥有2个或更多喜欢的座位。虽然没有明确说明,OP意味着学生在任何教室中最多应该有一个(0或1)最喜欢的座位。

我们可以通过在表格上添加唯一键来解决这个问题。再次使用pseudo-sql:

alter table FavouriteSeat add unique key (StudentID, ClassroomID) 

现在,学生只能在任何教室里拥有一个最喜欢的座位。还有一个问题仍然存在。该解决方案目前不支持定义哪些座位在哪些教室中可用。我们可以通过以下方式解决这个问题:

  1. 添加一个列出每个教室有效座位的新表:

    创建表ClassroomSeat(    ClassroomID ID不为null,    SeatID ID不为空)

    alter table ClassroomSeat添加唯一键(ClassroomID,SeatID)

  2. 将一个外键添加到FavouriteSeat表中,使其只能引用有效的ClassroomSeats:

    alter table FavouriteSeat添加外键FK_Seat(ClassroomID,SeatID引用FavouriteSeat(ClassroomID,SeatID)。

  3. 就是这样。 2个关系,3个密钥和标准CRUD操作涵盖了所述的所有要求。

    关系模型可以很容易地在OO / DDD中翻译。它需要一个实体用于FavouriteSeat和ClassroomSeat以及CRUD操作的方法。这些方法必须强制执行独特的&amp;以上的外键约束。

    为了满足规定的要求,客户,课堂和座位可以是价值类型(尽管可能有更广泛的未说明的要求可能会改变这种要求)。无论哪种方式,他们都需要一个唯一的标识符属性,可以在FavouriteSeat方法中进行检查。