0

我有一個表示組織(不論是商業實體,棒球隊還是播客)的基本實體「組織」。這是相當通用的。動態組織人員的域對象設計

這些組織中的每一個都可以有多個員工,每個員工可以是不同的類型。我們希望這是通用和可變的,以便我們可以有一種或多種不同類型的員工(CEO,女服務員,教練員,私人培訓師,經理,董事會成員)。有沒有一個確定的方法來處理這個問題?

如果不是這樣,我的解決方案的任何反饋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) 

這個問題似乎還好嗎?員工類型是我們可以根據需要創建的代表員工類型的對象(主持人,首席執行官,首席財務官,董事會成員,教練等)。所以一名工作人員知道這個人和這個類型。我們正在使用MongoDB,因此「員工」屬性可能是嵌入的員工集合。

我只是想確保我不俯瞰任何東西,所以任何反饋將不勝感激!

回答

1

你應該考慮的一件事是組織中員工的預期數量。如果這個數字非常大,或者比任何時候想要記憶的數量都大,那麼你可以考慮使用存儲庫而不是直接引用來實現這種關聯。這意味着組織類不會直接引用員工集合,而是必須使用存儲庫檢索員工集合。看看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; 
} 

這允許大量角色的公司內的員工。這很方便,因爲您可以通過公司參考輕鬆獲取角色/員工名單,而且您無需將詳細信息存儲在公司文檔中。