2009-06-02 14 views
3

Comment modéliser une telle situation? Comment la base de données devrait-elle être conçue? Quelles classes devrais-je avoir? Chaque employé appartient à au moins un projet, chaque projet a de nombreuses tâches, chaque tâche est assignée à au moins un employé.Une requête de modélisation/conception de classe

je devrais être en mesure de désabonnement

  • les employés travaillant sur un projet.
  • les tâches qui appartiennent à un projet
  • les tâches sur lesquelles un employé travaille.

etc ...

sont des relations circulaires/cycliques une mauvaise conception peut-il être éliminé?

Comment les entités doivent-elles être représentées dans une base de données? Comment les entités devraient-elles être représentées en utilisant des classes?

Merci d'avance,

Répondre

0

commencez avec la base de données et travaillez à partir de là. J'ai besoin de plus d'informations pour recommander une structure de classe. Voudriez-vous/avez-vous besoin d'objets pour les employés? ou seraient-ils une propriété d'un projet? etc ..

conception DB:

Projects 
    ProjectID 
    ProjectName... 
    EmployeeID 

Tasks 
    TaskID 
    ProjectID 
    TaskName... 
    EmployeeID 

Employees 
    EmployeeID 
    EmployeeName... 
+0

Projet, tâche et employé sont tous les classes –

+0

@ i.seek.therefore.i.am, c'est un peu difficile à dire de la question ;-) –

1

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.

+0

si vous avez une tâche avec plusieurs personnes affectées ou une seule tâche sur plusieurs projets, c'est une bonne approche. Sinon, je pense que c'est un peu exagéré et lourd. –

+0

Je comprends votre point de vue. Mais la question dit qu'une tâche sera assignée à "au moins un" employé. Pour moi, cela signifie que la conception doit prendre en charge plusieurs employés pour une tâche. C'est pourquoi j'ai pris cette approche. – TMarshall

0

je ferais quelque chose comme ça pour la conception de base de données:

Create Table Projects 
(
    ProjectID int Identity(1,1), 
    ProjectName varchar(50) Primary Key NonClustered, 
    OtherStuff varchar(255) 
) 
CREATE CLUSTERED INDEX IX_PROJECTS_ID ON dbo.Projects(ProjectID) 

Create Table Employees 
(
    EmployeeID int Identity(1,1), 
    EmployeeName varchar(50) Primary Key NonClustered, 
) 
CREATE CLUSTERED INDEX IX_EMPLOYEES_ID ON dbo.Employees(EmployeeID) 

Create Table ProjectEmployees 
(
    ProjectID int, 
    EmployeeID int, 
    Constraint pk_ProjectEmpoyees Primary Key (ProjectID, EmployeeID) 
) 

Create Table Tasks 
(
    TaskID int Identity(1,1), 
    TaskName varchar(50) Primary Key NonClustered, 
    AssignedEmployeeID int, --NOTE: assumes only 1 employee per task 
    OtherStuff varchar(255) 
) 
CREATE CLUSTERED INDEX IX_TASKS_ID ON dbo.Tasks(TaskID) 

Create Table TaskPrecedents 
(
    TaskID int, 
    PrecedentTaskID int, 
    PrecedentType Char(2) --Codes, you'll have to work these out 
    Constraint pk_TaskPrecedents Primary Key (TaskID, PrecedentTaskID) 
) 
1

Je vais essayer de répondre à vos questions comme générique d'une manière que je peux, et éviter de répéter les structures spécifiques de la table comme dans la précédente réponses D'une manière générale, les relations cycliques entre vos entités ne sont pas une mauvaise chose ... au contraire, ils sont assez communs:

There are many Projects 
Projects have Employees 
Projects have Tasks 
Employees are assigned some Tasks 

Même si un projet a des employés ... et les employés a aussi un projet (ou, peut-être de nombreux projets si un employé peut travailler sur plus d'un projet à la fois). Du point de vue de la base de données, lorsque vous créez une clé étrangère, cette relation "circulaire" existe que vous le vouliez ou non. La question la plus importante est, d'un point de vue conceptuel, est-ce important qu'un employé sache de quel (s) projet (s) il fait partie? Bien qu'il soit probablement très important qu'un Projet sache ce que les employés y travaillent ... il n'est peut-être pas important qu'un Employé connaisse le projet dans lequel il travaille. C'est ce qu'on appelle la "Navigabilité", et contrairement à notre structure de base de données, nous POUVEZ contrôler ceci avec nos classes. Un objet Projet aurait une collection d'objets Employé, mais l'objet Employé n'a pas nécessairement besoin d'avoir une propriété Projet (ou une collection de Projets.)

Il n'y a pas de réponse standard que je peux vous donner concernant la navigabilité. C'est généralement subjectif, et dépend des besoins de votre entreprise. Si l'idée que votre modélisation a le concept d'un employé sachant sur quels projets il travaille, et que cette connaissance est importante pour l'achèvement des processus que votre logique métier va effectuer ... alors vous avez besoin de cette relation circulaire. Idem pour la navigabilité entre les employés et les tâches, les projets et les tâches, etc

Questions connexes