一个类建模/设计的问题

3

我该如何对这种情况进行建模?数据库应该如何设计?我应该有哪些类?

问题陈述:每个员工至少属于一个项目,每个项目有许多任务,每个任务分配给至少一个员工。

我应该能够输出:

  • 参与项目的员工。
  • 属于项目的任务。
  • 某个员工正在处理的任务。

等等...

循环/循环关系是否是不好的设计?它是否可以消除?

实体应该如何在数据库中表示?使用类应该如何表示实体?

提前致谢,

4个回答

1

我会尽可能以通用的方式回答你的问题,并避免重复之前回答中的具体表结构。一般来说,实体之间的循环关系并不是坏事...相反,它们非常普遍:

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

当一个项目有员工时...每个员工也有一个项目(或者,如果一个员工可以同时在多个项目上工作,则可能有多个项目)。从数据库的角度来看,当您创建外键时,无论您是否希望存在“循环”关系,该关系都存在。

更重要的问题是,从概念上讲,员工知道自己参与的项目是否重要?虽然项目知道哪些员工正在为其工作可能非常重要...但员工知道自己所在的项目可能并不重要。这就是所谓的“可导航性”,与我们的数据库结构不同,我们可以通过我们的类来控制它。项目对象将具有一组员工对象,但员工对象不一定需要具有项目属性(或项目集合)。

我无法给您关于可导航性的通用答案。这通常是主观的,并取决于您业务的需求。如果您建模的业务具有员工知道他们正在工作的项目的概念,并且该知识对完成业务逻辑将执行的流程非常重要...那么您需要该循环关系。对于员工和任务、项目和任务等之间的可导航性也是如此。


1

您没有提及性能或使用要求,因此我将以通用方式回答,并在需要更具体信息时更新我的答案。对于数据库表,我建议采用以下常见的规范化方法。

tblProject
    ProjectID
    ProjectDescription etc.

tblTask
    TaskID
    TaskDescription etc.

tblEmployee
    EmployeeID
    Name etc.

tblProjectTasks
    ProjectTasksID
    ProjectID
    TaskID

tblTaskAssignments
    TaskAssignmentsID
    TaskID
    EmployeeID

另一种有效的方法是创建一个定义项目的表和一个定义项目列表的不同表。对于任务和员工也是如此。在现实世界的应用中,这些实体通常在更通用的表中被很好地定义,就像您可能设计包含其他明确定义对象的类一样。例如,您没有提到除员工之外的项目资源。这些资源可以在定义资源类型、资源属性等模式中表示,然后将资源连接到项目和/或任务。

您还可以创建代表项目员工的表,但其中的数据将是冗余的,因为您可以通过连接其他表找到分配给项目的员工。在我看来,只有当表非常庞大并且这种特定类型的查询非常频繁时,才会保证这种重复。但我仍然会首先考虑其他方法。

您还问到了类。如果没有更好的了解您的目标,很难过于具体。在典型的OO设计中,类应该明确表示项目、任务和员工。但您需要根据自己的特定需求进行调整。


如果您有一个由多个人分配的任务或一个单一任务在多个项目中,那么这是一个很好的方法。如果没有,我认为这有点过度和繁琐。 - KM.
我理解您的意思。但是问题说一个任务将会分配给“至少一个”员工。对我来说,这意味着设计必须支持为一个任务分配多个员工。这就是我采取这种方法的原因。 - TMarshall

0

从数据库开始,然后进行处理。我需要更多信息来推荐类结构。您想要/需要为员工创建对象吗?还是它们是项目属性?等等...

数据库设计:

Projects
    ProjectID
    ProjectName...
    EmployeeID

Tasks
    TaskID
    ProjectID
    TaskName...
    EmployeeID

Employees
    EmployeeID
    EmployeeName...

项目、任务和员工都是类。 - user115263
@i.seek.therefore.i.am,这个问题有点难以判断啊;-) - KM.

0

针对数据库设计,我会做出类似以下的操作:

    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)
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接