0

조직 (조직, 야구 팀 또는 포드 캐스트)을 나타내는 기본 조직 "조직"이 있습니다. 그것은 아주 일반적입니다.동적 조직 직원을위한 도메인 개체 디자인

각 조직에는 여러 직원이있을 수 있으며 각 직원은 다른 유형이 될 수 있습니다. 우리는 이것이 일반적이고 가변적이기를 원하기 때문에 다른 종류의 직원 (CEO, 웨이트리스, 코치, 개인 트레이너, 매니저, 이사) 중 하나 이상을 보유 할 수 있습니다. 이것을 처리 할 수있는 방법이 있습니까?

하지 IF

은, 내 솔루션에 대한 의견은 크게 감상 할 수 woud :

그래서, 나는 조직에 "직원"회원을함으로써이 문제를 표현하고 싶다. 스태프는 "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) 

괜찮습니까? 직원 유형은 직원 유형 (주최자, CEO, CFO, 이사회 멤버, 코치 등)을 나타내는 필요에 따라 만들 수있는 개체입니다. 따라서 직원은 그 사람과 유형을 압니다. 우리는 MongoDB를 사용하여 "staff"속성이 StaffMembers의 임베디드 컬렉션이 될 가능성이 있습니다.

나는 단지 내가 무엇을 놓치고 있지 않다는 것을 확인하고 싶다. 그래서 어떤 피드백이라도 크게 환영받을 것이다!

답변

1

고려해야 할 사항 중 하나는 조직의 예상 스태프 수입니다. 이 숫자가 매우 크거나 주어진 순간에 기억하고 싶은 것보다 큰 경우 직접 참조 대신 저장소와의 연결을 구현하는 것을 고려할 수 있습니다. 이는 Organization 클래스가 스태프 콜렉션을 직접 참조하지 않고 스태프 콜렉션을 리포지토리와 함께 검색해야한다는 것을 의미합니다. 자세한 내용은 here을 참조하십시오.

또한 StaffMember와 Organization 사이의 양방향 연관을주의하십시오. 모델은 저렴하지만 구현하기에 더 비쌉니다. 기본적으로 역방향 관계가 필요하지 않은 방식으로 시스템을 설계하십시오.

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; 
} 

이렇게하면 많은 양의 역할이있는 회사 내에서 많은 양의 직원을 허용합니다. 회사 레퍼런스를 통해 쉽게 역할/직원 목록을 얻을 수 있고 회사 문서 내에 세부 정보를 저장할 필요가 없기 때문에 편리합니다.