Если я правильно понимаю, ваш домен можно смоделировать так:
- 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
Используя доменно-управляемый дизайн, мы вообще не будем думать о таблицах. Мы думаем об агрегатах и, возможно, даже об ограниченных контекстах. Но чтобы не усложнять вещи, я сохраню их на уровне совокупности:
У нас может быть два совокупных корня:
1. Nominator (who knows all their stories)
2. Ballot (which knows all their nominated stories as
well as the respective nominators)
Возможно, к самой истории вообще не будет доступа напрямую, но только через Номинатор или Бюллетень соответственно.
Есть ли причина, по которой история существует, если она не принадлежит номинатору или не выдвинута в избирательный бюллетень? Если нет, сделайте его недоступным сам по себе и только выставьте напр. Nominator.GetStories()
, Nominator.GetNominatedStoriesFor(ballot)
и / или Ballot.GetStories()
Чтобы добавить историю в избирательный бюллетень, я бы либо выставил Nominator.NominateStory(storyId, ballotId)
, либо Ballot.Add(storyId)
.
Когда дело доходит до хранения в базе данных, у меня, вероятно, будет таблица NominatedStories
с ballotId
и storyId
и таблица Stories
с подробностями истории и nominatorId