我有一个可以分配一个提名者的故事。可以将提名者分配给多个故事。提名者可以将故事移至他们的选票(不是故事只能属于他们的提名者选票)。我过去总是做数据驱动的应用程序,所以不幸的是我已经在考虑如何处理选票了。由于Story表有一个分配给它的指定者id,因此在表中添加一个IsBallot标志是有意义的。但是现在在我的实际领域设计中,故事有一种行为可以将自己添加到选票中(这看起来很奇怪,因为有关于此的提名者有规则)。我想它可以询问提名人是否可以加入选票。我的第二个选择是让另一个表StoryBallot包含提名者ID和故事ID。这里有什么奇怪的故事已经包含了提名者ID,而这张新表也有它。
任何想法或建议都会很棒!
答案 0 :(得分:1)
如果我理解正确,您的域名可以像这样建模:
- A Nominator has stories
- A Nominator can nominate Stories for a Ballot
- A Ballot knows all its Stories and their respective Nominator
- A Story knows its Nominator
使用域驱动设计我们根本不会想到表格。我们会想到聚合,甚至可能是有界背景。但是为了不使事情过于复杂,我将把它保持在Aggregate-Level:
我们可以有两个聚合根:
1. Nominator (who knows all their stories)
2. Ballot (which knows all their nominated stories as
well as the respective nominators)
故事本身可能根本无法直接访问,只能分别通过Nominator或Ballot。
如果一个故事没有被提名者拥有或被提名投票,是否有理由存在?如果没有,请使其自身无法访问,并且仅暴露,例如Nominator.GetStories()
,Nominator.GetNominatedStoriesFor(ballot)
和/或Ballot.GetStories()
要将选票添加到选票中,我要么展示Nominator.NominateStory(storyId, ballotId)
或Ballot.Add(storyId)
。
当涉及到存储在数据库中时,我可能会有一个表NominatedStories
ballotId
和storyId
以及一个表Stories
,其中包含故事详情和{{ 1}}