类建模/设计查询

时间:2009-06-02 18:32:07

标签: c# database-design oop class-design cyclic-reference

我如何模拟这种情况?应该如何设计数据库?我应该上几节课?

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

我应该能够制作出来

  • 从事项目的员工。
  • 属于项目的任务
  • 给定员工正在处理的任务。
等等......

圆形/循环关系是否可以消除不良设计?

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

提前致谢,

4 个答案:

答案 0 :(得分:1)

您没有提及有关性能或使用要求的任何内容,因此我将以通用方式回答,如果您需要更具体的信息,我会更新我的答案。对于数据库表,我建议采用一种常见的规范化方法。

tblProject
    ProjectID
    ProjectDescription etc.

tblTask
    TaskID
    TaskDescription etc.

tblEmployee
    EmployeeID
    Name etc.

tblProjectTasks
    ProjectTasksID
    ProjectID
    TaskID

tblTaskAssignments
    TaskAssignmentsID
    TaskID
    EmployeeID

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

您还可以创建一个表示项目员工的表,但其中的数据将是多余的,因为您可以通过加入其他表来找到分配给项目的员工。恕我直言,如果表格很大并且非常频繁地使用这种特殊类型的查询,那么这种复制只能得到保证。但我还是先考虑其他方法。

您还询问了这些课程。没有更好地理解你的目标,很难过于具体。在典型的OO设计中,类应该清楚地表示Project,Task和Employee。但是你需要根据自己的特定需求进行定制。

答案 1 :(得分:1)

我会尝试以尽可能通用的方式回答您的问题,并避免像以前的回复中那样重复特定的表格结构。一般来说,你的实体之间的循环关系并不是坏事......相反,它们很常见:

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

虽然项目有员工......而员工也有项目(或者,如果员工一次可以处理多个项目,可能还有很多项目)。从数据库的角度来看,当您创建外键时,无论您是否想要它,都存在“循环”关系。

更重要的问题是,从概念的角度来看,如果员工知道它是哪个项目的一部分,这是否重要?虽然项目可能知道员工正在做什么可能非常重要......但是员工知道其工作的项目可能并不重要。这就是所谓的“导航性”,与我们的数据库结构不同,我们CAN可以通过我们的课程控制它。 Project对象将具有Employee对象的集合,但Employee对象不一定需要具有Project属性(或Projects的集合。)

我可以提供有关导航性的固定答案。这通常是主观的,取决于您的业务需求。如果您的建模具有员工的概念,他们知道他们正在处理哪些项目,并且知识对于完成业务逻辑将要执行的流程很重要......那么您需要这种循环关系。员工与任务,项目和任务等之间的可导航性也是如此。

答案 2 :(得分:0)

从数据库开始,然后从那里开始工作。我需要更多信息来推荐一个类结构。你想要/需要雇员的对象吗?或者他们是项目的财产?等。

数据库设计:

Projects
    ProjectID
    ProjectName...
    EmployeeID

Tasks
    TaskID
    ProjectID
    TaskName...
    EmployeeID

Employees
    EmployeeID
    EmployeeName...

答案 3 :(得分: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)
)