我该如何对这种情况进行建模?数据库应该如何设计?我应该有哪些类?
问题陈述:每个员工至少属于一个项目,每个项目有许多任务,每个任务分配给至少一个员工。
我应该能够输出:
- 参与项目的员工。
- 属于项目的任务。
- 某个员工正在处理的任务。
等等...
循环/循环关系是否是不好的设计?它是否可以消除?
实体应该如何在数据库中表示?使用类应该如何表示实体?
提前致谢,
我该如何对这种情况进行建模?数据库应该如何设计?我应该有哪些类?
问题陈述:每个员工至少属于一个项目,每个项目有许多任务,每个任务分配给至少一个员工。
我应该能够输出:
等等...
循环/循环关系是否是不好的设计?它是否可以消除?
实体应该如何在数据库中表示?使用类应该如何表示实体?
提前致谢,
我会尽可能以通用的方式回答你的问题,并避免重复之前回答中的具体表结构。一般来说,实体之间的循环关系并不是坏事...相反,它们非常普遍:
There are many Projects
Projects have Employees
Projects have Tasks
Employees are assigned some Tasks
当一个项目有员工时...每个员工也有一个项目(或者,如果一个员工可以同时在多个项目上工作,则可能有多个项目)。从数据库的角度来看,当您创建外键时,无论您是否希望存在“循环”关系,该关系都存在。
更重要的问题是,从概念上讲,员工知道自己参与的项目是否重要?虽然项目知道哪些员工正在为其工作可能非常重要...但员工知道自己所在的项目可能并不重要。这就是所谓的“可导航性”,与我们的数据库结构不同,我们可以通过我们的类来控制它。项目对象将具有一组员工对象,但员工对象不一定需要具有项目属性(或项目集合)。
我无法给您关于可导航性的通用答案。这通常是主观的,并取决于您业务的需求。如果您建模的业务具有员工知道他们正在工作的项目的概念,并且该知识对完成业务逻辑将执行的流程非常重要...那么您需要该循环关系。对于员工和任务、项目和任务等之间的可导航性也是如此。
您没有提及性能或使用要求,因此我将以通用方式回答,并在需要更具体信息时更新我的答案。对于数据库表,我建议采用以下常见的规范化方法。
tblProject
ProjectID
ProjectDescription etc.
tblTask
TaskID
TaskDescription etc.
tblEmployee
EmployeeID
Name etc.
tblProjectTasks
ProjectTasksID
ProjectID
TaskID
tblTaskAssignments
TaskAssignmentsID
TaskID
EmployeeID
另一种有效的方法是创建一个定义项目的表和一个定义项目列表的不同表。对于任务和员工也是如此。在现实世界的应用中,这些实体通常在更通用的表中被很好地定义,就像您可能设计包含其他明确定义对象的类一样。例如,您没有提到除员工之外的项目资源。这些资源可以在定义资源类型、资源属性等模式中表示,然后将资源连接到项目和/或任务。
您还可以创建代表项目员工的表,但其中的数据将是冗余的,因为您可以通过连接其他表找到分配给项目的员工。在我看来,只有当表非常庞大并且这种特定类型的查询非常频繁时,才会保证这种重复。但我仍然会首先考虑其他方法。
您还问到了类。如果没有更好的了解您的目标,很难过于具体。在典型的OO设计中,类应该明确表示项目、任务和员工。但您需要根据自己的特定需求进行调整。
从数据库开始,然后进行处理。我需要更多信息来推荐类结构。您想要/需要为员工创建对象吗?还是它们是项目属性?等等...
数据库设计:
Projects
ProjectID
ProjectName...
EmployeeID
Tasks
TaskID
ProjectID
TaskName...
EmployeeID
Employees
EmployeeID
EmployeeName...
针对数据库设计,我会做出类似以下的操作:
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)
)