我有一个基本实体"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;
}
这允许在一个拥有大量角色的公司中拥有大量员工。它很方便,因为您可以通过公司参考资料轻松获得角色/员工列表,而且不需要将详细信息存储在公司文档中。