为 Employee-Manager 设计数据结构

Posted

技术标签:

【中文标题】为 Employee-Manager 设计数据结构【英文标题】:Design data structure for Employee-Manager 【发布时间】:2014-05-21 10:20:45 【问题描述】:

问题是为员工/经理系统设计一个结构。

1) 员工属于经理。

2) 一位经理有多名员工。

3) 经理也可能属于经理。

4) 员工只有一名经理

设计数据结构,使其支持以下操作:删除员工/经理,晋升(员工成为经理)。

任何编程语言都可以。

注意:我不想要代码。口头解释就好了。

【问题讨论】:

【参考方案1】:

我的第一个想法是使用 employee 作为基类,并使用属性 manager 作为指向经理对象(以及其他必要的属性,如“id”)和类的指针manager,继承自 employee 并带有指向员工的指针列表。

这可以包装在一个模型中,该模型包含所有员工/经理的列表以及“提升(员工)”等方法。 Employee 也可以有一个像“promote”这样的方法,它返回一个经理对象。经理类可以有一个带有员工参数的构造函数...

更新(C# 代码):

public class Employee


    public string ID;
    public Manager Manager;

    public Manager promote()  return new Manager(this); 

    public Employee()  



public class Manager : Employee


    public List<Employee> Employees;

    public Manager()  
    public Manager(Employee employee) ...



public class EmployeeModel


    private List<Employee> employees;
    public List<Employee> Employees  get  return this.employees;  

    public void addEmployee(...) ...
    public void removeEmployee(...) ...
    public void promoteEmployee(...) ...


好像是这样的……

【讨论】:

对不起,你能画一个UML或者用伪代码给出类声明吗?谢谢【参考方案2】:

您只需要一张桌子:

CREATE TABLE employees (
id integer NOT NULL,
name varchar(50) DEFAULT NULL,
manager_id integer DEFAULT NULL,
PRIMARY KEY (id)
)

这个表有一个对自身的引用(manager_id->id)。

如果记录在“manager_id”字段中的值为 NULL,那么它是一个***经理。所有其他记录在“manager_id”字段中应该有一些值,这是对 PrimaryKey 字段“id”的引用

【讨论】:

+1,这是一个很好的答案,但我正在寻找与数据结构相关的东西。我应该清楚地提到这一点。对不起。【参考方案3】:

从设计的角度来看,我会使用复合设计模式。 【复合图】:http://en.wikipedia.org/wiki/File:Composite_UML_class_diagram_(fixed).svg。每个员工(可能是经理)都持有指向其经理的指针,并且每个经理都持有指向其员工的指针列表。但只有一个类( Employee )。

【讨论】:

您能详细解释一下吗?关于这个例子?谢谢 你应该有一个如下所示的类: Class Employee Employee manager;字符串名称; LevelEnum 级别;列出 员工; 在促销的情况下只改变枚举级别。在简单员工的情况下,员工列表将是一个空列表。【参考方案4】:

我会说首先找出实体(您已经拥有,员工和经理)。 现在根据您的约束找出关系:

经理对员工(一对多)

员工到经理(一对一)

员工可以是经理。

选项

    有一个单一的Class 员工,其中“有”(关联)List of Employee 在 Employee 本身中有 Employee(作为经理,Employee reportsTo)的引用。

以上两个选项中的疼痛区域: 选项#1 如果您删除经理,那么员工列表将成为孤儿(没有经理的员工) 选项#2 如果您想查看单个经理下的所有员工,那么您需要遍历所有员工以获取经理的员工 ID。

期待其他答案。

【讨论】:

好方法,但有你提到的问题。我在面试中被问到这个问题,无法回答。我也在寻找其他答案。 您不必迭代所有对象。您应该只为具有特定经理的员工查询数据库。 SELECT * from EMPLOYEE where manager_id = "xxxx";

以上是关于为 Employee-Manager 设计数据结构的主要内容,如果未能解决你的问题,请参考以下文章

为数据仓库设计一个关系船

为不同的数据集构建数据库设计

教练,我想学设计之禅

教练,我想学设计之禅

为购物车应用程序设计数据库? [关闭]

为 DirectAccess 设计 DNS 基础结构