0

我有一个代表组织(无论是商业实体、棒球队还是播客)的基本实体“组织”。这是相当通用的。

这些组织中的每一个都可以有多个员工,每个员工可以是不同的类型。我们希望这是通用的和可变的,以便我们可以拥有一种或多种不同类型的员工(CEO、女服务员、教练、私人教练、经理、董事会成员)。有没有既定的方法来处理这个问题?

如果没有,对我的解决方案的任何反馈将不胜感激:

因此,我想通过在组织中拥有一名“员工”成员来代表这一点。Staff 将是“StaffMember”对象的集合,它们依次是:

StaffMember:
    person(a Person object)
    organization(an Organization object)(this may not be necessary if StaffMember is only used on an org)
    staffType

StaffType:
    title(string)
    significance(int)

这看起来好吗?员工类型是我们可以根据需要创建的代表员工类型(主持人、首席执行官、首席财务官、董事会成员、教练等)的对象。因此,工作人员知道人员和类型。我们正在使用 MongoDB,因此“staff”属性可能是 StaffMembers 的嵌入式集合。

我只是想确保我没有忽略任何东西,所以任何反馈都将不胜感激!

4

2 回答 2

1

我们的产品也有类似的结构。这就是我们实现它的方式。

/** @MongoDB\Document(collection="companies") */
class Company
{
    // Properties

    /** @MongoDB\Id */
    protected $id;

    /** @MongoDB\String */
    protected $name;

    /** @MongoDB\ReferenceMany(targetDocument="Employee", mappedBy="company", cascade={"remove"}) */
    protected $employees;

    /** @MongoDB\ReferenceMany(targetDocument="Role", mappedBy="company", cascade={"remove"}) */
    protected $roles;
}

/**
 * @MongoDB\Document(collection="roles")
 * @MongoDB\UniqueIndex(keys={"title"="asc", "company"="asc"})
 */
class Role
{

    /** @MongoDB\Id */
    protected $id;

    /** @MongoDB\String */
    protected $title;

    /** @MongoDB\String */
    protected $description;

    /** @MongoDB\ReferenceMany(targetDocument="Employee", mappedBy="role") */
    protected $employees;

    /** @MongoDB\ReferenceOne(targetDocument="Company", inversedBy="roles") */
    protected $company;
}

/**
 * @MongoDB\Document
 * @MongoDB\DiscriminatorField(fieldName="type")
 * @MongoDB\DiscriminatorMap({"person"="Person", "employee"="Employee"})
 */
class Employee extends Person
{
    // Properties

    /** @MongoDB\String */
    protected $employeeId;

    /** @MongoDB\ReferenceOne(targetDocument="Role", inversedBy="employees") */
    protected $role;

    /** @MongoDB\ReferenceOne(targetDocument="Company", inversedBy="roles") */
    protected $company;
}

这允许公司内的大量员工具有大量角色。这很方便,因为您可以通过公司参考轻松获取角色/员工列表,而无需将详细信息存储在公司文档中。

于 2012-08-29T22:54:44.487 回答
1

您应该考虑的一件事是组织中的预期工作人员数量。如果这个数字非常大,或者大于您在任何给定时刻希望在内存中拥有的数字,那么您可以考虑使用存储库而不是直接引用来实现此关联。这意味着组织类不会直接引用人员集合,而是必须使用存储库检索人员集合。在此处查看有关此内容的更多详细信息。

此外,请注意双向关联,例如 StaffMember 和 Organization 之间的关联。它们的建模成本低,但实施成本更高。基本上,尝试以不需要反向关系的方式设计系统。

于 2012-08-29T18:29:16.897 回答