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