面向动态组织员工的领域对象设计



我有一个基本实体"Organization",它代表一个组织(无论是商业实体、棒球队还是播客)。它很普通。

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

如果没有,我们将非常感谢对我的解决方案的任何反馈:

因此,我想通过组织中的一名"工作人员"来代表这一点。工作人员将是"工作人员成员"对象的集合,这些对象依次为:

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)

这看起来还好吗?员工类型是我们可以根据需要创建的对象,代表员工类型(Host、CEO、CFO、Board Member、Coach等)。所以工作人员知道这个人和类型。我们正在使用MongoDB,因此"staff"属性可能是StaffMembers的嵌入式集合。

我只是想确保我没有忽视任何事情,所以任何反馈都将不胜感激!

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

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

我们的产品有类似的结构。这就是我们如何做到的

/** @MongoDBDocument(collection="companies") */
class Company
{
    // Properties
    /** @MongoDBId */
    protected $id;
    /** @MongoDBString */
    protected $name;
    /** @MongoDBReferenceMany(targetDocument="Employee", mappedBy="company", cascade={"remove"}) */
    protected $employees;
    /** @MongoDBReferenceMany(targetDocument="Role", mappedBy="company", cascade={"remove"}) */
    protected $roles;
}
/**
 * @MongoDBDocument(collection="roles")
 * @MongoDBUniqueIndex(keys={"title"="asc", "company"="asc"})
 */
class Role
{
    /** @MongoDBId */
    protected $id;
    /** @MongoDBString */
    protected $title;
    /** @MongoDBString */
    protected $description;
    /** @MongoDBReferenceMany(targetDocument="Employee", mappedBy="role") */
    protected $employees;
    /** @MongoDBReferenceOne(targetDocument="Company", inversedBy="roles") */
    protected $company;
}
/**
 * @MongoDBDocument
 * @MongoDBDiscriminatorField(fieldName="type")
 * @MongoDBDiscriminatorMap({"person"="Person", "employee"="Employee"})
 */
class Employee extends Person
{
    // Properties
    /** @MongoDBString */
    protected $employeeId;
    /** @MongoDBReferenceOne(targetDocument="Role", inversedBy="employees") */
    protected $role;
    /** @MongoDBReferenceOne(targetDocument="Company", inversedBy="roles") */
    protected $company;
}

这允许在一个拥有大量角色的公司中拥有大量员工。它很方便,因为您可以通过公司参考资料轻松获得角色/员工列表,而且不需要将详细信息存储在公司文档中。

相关内容

  • 没有找到相关文章

最新更新