2010-03-26 61 views
1

我不知道如何将这种关系模型最喜欢的座位......DDD建模的问题:学生,课堂上,座椅和一个学生

教室里包含了许多座位,每一个学生的研究在教室里和有它最喜欢的座位。

我看到它的方式,我有两个总根源:教室和学生,席位是由教室aggregatged实体...

而对于一个学生有一个fovorite席位,就必须坚持一个参考它(座位不是聚合根)。

有什么建议吗? 在此先感谢,Erik。

回答

0

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

+0

您好,感谢您的答复,座椅可能不是一个值对象... 我可以有exacly在两个独立的classroms相同数据的座位...... 的要求是: 答用户可以选择他想要学习的教室。 B.选择教室后,用户可以在教室中选择一个最喜欢的座位。 我没有找到一种方法来模拟那些没有学生参考座位的用例(这不是一个聚合根,并且是教室里的一个实体)。 在此先感谢, Erik。 – 2010-03-29 12:31:33

+0

如果座位上的数据相同,并且当您访问座位时,您使用了特定的教室聚合根,那么您可能知道座位的所有信息,并且您可以省去很多数据(Flyweight设计模式)。这也可以简化最喜欢的座位关联,这将包含课堂参考和座位价值。 – 2010-03-29 13:02:44

+0

对不起,但我不明白...你是否建议座位是一个价值对象?学生会直接参考座位班吗? 这是教室和座位之间的一对多关系..这怎么可能? – 2010-03-29 19:01:11

0

每个座位可能会有一个座位最喜欢的学生列表。课堂聚合根将负责维护学生在教室中不能拥有多个最喜欢的座位的限制。有了这个选项座位是一个实体(而不是一个价值对象),通过课堂聚集到学生的参考。

+0

感谢您的建议,我想过这种方法,但它有缺陷... 1.座位了解学生...可能有一个方法:seat.MakeFavoriteByStudent(学生)。 2.删除学生时可能存在完整性和一致性问题。 总的来说这很不错,因为当删除一扇门时,它会删除引用它的学生最喜欢的座位分配... – 2010-03-30 13:41:15

+0

座位是否值对象或实体?在课堂上的座位与同班的另一个座位有什么不同?座位只有行,列属性吗?如果它们是价值对象,则可能意味着相同的座位(例如:row = 1,col = 1)被N个教室引用。在这种情况下,我将创建座位聚合根并添加学生的参考。如果用户可以选择每间教室的差异座位,我可以添加由学生聚集的FavSeatClassroom实体,并参考课堂和座位。 – fgui 2010-03-30 16:12:11

+0

我想这取决于...我看到它的方式,座位是一个实体(它有本地的身份),两个教室都可以有一个座位在行= 1和col = 1,但它不是座位...我可以删除那个教室,座位也会被删除... 这就是为什么座位可能不是一个聚合根... 我想过这个更多,我想座位应该是由学生引用...违反了参考法律...这将增加完整性验证(如果学生参考座位或其他方式,则不能删除教室)... – 2010-03-31 10:23:40

0

这听起来像你需要引入一个值对象,Location,它描述了在课堂上点,然后你可以他们这样的学生类模型:

public IDictionary<Classroom, Location> FavoriteSeats; 

教室可以参考Seat实体由他们的位置。

(如果他们真的实体摆在首位 - 你甚至会发现你并不需要建模席位实体(例如,“那闻起来像汉堡包的蓝色塑料椅)。)

0

OP之后的几个月,但以防万一它是有用的

@Jeff Sternal是在正确的轨道上,这个问题从根本上管理学生,教室和座位之间的三路(三元)关系,因为它是关系型问题,让我们暂时保留关系概念,并将其称为FavouriteSeat(Student,Classroom,Seat)。

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

在伪SQL,我们有:

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

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

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

alter table FavouriteSeat add unique key (StudentID, ClassroomID) 

现在,学生只能有一个最喜欢的座位给任何给定的教室。还有一个问题。该解决方案目前不支持在什么课堂上定义什么座位可用。我们可以解决的:

  1. 添加一个新表,列出了在每个教室的有效席位数:

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

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

  2. 将外键添加到FavouriteSeat表中,以便它只能引用有效的ClassroomSeats:

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

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

关系模型可以很容易地在OO/DDD中进行翻译。它需要一个实体为FavouriteSeat和ClassroomSeat提供CRUD操作的方法。这些方法必须强制执行上述唯一的外键约束。

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