Vous n'avez rien dit au sujet des exigences de performance ou de l'utilisation, donc je vais répondre de manière générique et je mettrai à jour ma réponse si vous avez besoin de plus information spécifique. Pour les tables DB, je suggère une approche normalisée commune dans ce sens.
tblProject
ProjectID
ProjectDescription etc.
tblTask
TaskID
TaskDescription etc.
tblEmployee
EmployeeID
Name etc.
tblProjectTasks
ProjectTasksID
ProjectID
TaskID
tblTaskAssignments
TaskAssignmentsID
TaskID
EmployeeID
Une autre approche valide serait de créer une table définissant un projet et une table différente pour définir une liste de projets. La même chose serait vraie pour les tâches et les employés. Dans une application du monde réel, il serait courant que ces entités soient bien définies dans des tables plus génériques, tout comme vous pouvez concevoir une classe qui contient d'autres objets bien définis. Par exemple, vous n'avez pas mentionné les ressources du projet autres qu'un employé. Ces ressources peuvent être représentées dans un schéma qui définit le type de ressource, les propriétés de ressource, etc., puis joint la ressource à un projet et/ou à une tâche.
Vous pouvez également créer une table représentant des employés de projet, mais les données qui s'y trouvent seraient redondantes puisque vous pourriez trouver les employés affectés à un projet en joignant les autres tables. À mon humble avis, ce type de duplication ne serait justifiée que si les tableaux sont énormes et ce type de requête est utilisé très fréquemment. Mais je considérerais toujours d'autres approches en premier.
Vous avez également posé des questions sur les classes. Il est difficile d'être trop précis sans une meilleure compréhension de vos objectifs. Dans une conception OO typique, les classes doivent représenter le projet, la tâche et l'employé distinctement. Mais vous devrez l'adapter à vos besoins spécifiques.
Projet, tâche et employé sont tous les classes –
@ i.seek.therefore.i.am, c'est un peu difficile à dire de la question ;-) –