Wenn ich drei Entitäten habe, Projekt, Projektrolle und Person, wobei eine Person Mitglied verschiedener Projekte sein kann und verschiedene Projektrollen innehaben kann (z. B. "Projektleiter" oder "Projektmitglied") - wie würden Sie eine solche Beziehung modellieren?
In der Datenbank habe ich derzeit die folgenden Tabler: Project, Person, ProjectRole Project_Person mit PersonId & ProjectId als PK und eine ProjectRoleId als FK-Beziehung.
Ich bin hier wirklich ratlos, da alle Domänenmodelle, die mir einfallen, gegen irgendeine "DDD"-Regel zu verstoßen scheinen. Gibt es irgendwelche "Standards" für dieses Problem?
Ich habe einen Blick auf Streamlined Object Modeling geworfen und es gibt ein Beispiel, wie ein Project und ProjectMember aussehen würden, aber AddProjectMember() in Project würde ProjectMember.AddProject() aufrufen. Project hat also eine Liste von ProjectMembers, und jedes ProjectMember hat im Gegenzug einen Verweis auf das Project. Sieht für mich ein wenig verworren aus.
Update
Nachdem ich mehr über dieses Thema gelesen habe, werde ich Folgendes versuchen: Es gibt verschiedene Rollen, oder besser gesagt, Modellbeziehungen, die von einer bestimmten Rollentyp innerhalb meiner Domäne. Zum Beispiel ist ProjectMember eine eindeutige Rolle, die uns etwas über die Beziehung sagt, die eine Person innerhalb eines Projekts spielt. Sie enthält einen ProjectMembershipType, der uns mehr über die Rolle verrät, die sie spielen wird. Ich weiß mit Sicherheit, dass Personen innerhalb eines Projekts Rollen spielen müssen, also werde ich diese Beziehung modellieren.
ProjectMembershipTypes können erstellt und geändert werden. Diese können "Projektleiter", "Entwickler", "Externer Berater" oder etwas anderes sein.
Eine Person kann mehrere Rollen innerhalb eines Projekts haben, und diese Rollen können zu einem bestimmten Zeitpunkt beginnen und enden. Solche Beziehungen werden durch die Klasse ProjectMember modelliert.
public class ProjectMember : IRole
{
public virtual int ProjectMemberId { get; set; }
public virtual ProjectMembershipType ProjectMembershipType { get; set; }
public virtual Person Person { get; set; }
public virtual Project Project { get; set; }
public virtual DateTime From { get; set; }
public virtual DateTime Thru { get; set; }
// etc...
}
ProjectMembershipType: z. B. "Projektleiter", "Entwickler", "Berater"
public class ProjectMembershipType : IRoleType
{
public virtual int ProjectMembershipTypeId { get; set; }
public virtual string Name { get; set; }
public virtual string Description { get; set; }
// etc...
}