0

組織 (ビジネス エンティティ、野球チーム、ポッドキャストなど) を表す基本エンティティ "Organization" があります。それはかなり一般的です。

これらの各組織は複数のスタッフを持つことができ、各スタッフは異なるタイプにすることができます。これを一般的で可変的なものにして、1 つまたは複数の異なるタイプのスタッフ (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)

これで大丈夫そうですか?スタッフ タイプは、スタッフ タイプ (ホスト、CEO、CFO、取締役、コーチなど) を表す、必要に応じて作成できるオブジェクトです。そのため、スタッフ メンバーは人物とタイプを知っています。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

考慮すべきことの 1 つは、組織内の予想されるスタッフ メンバーの数です。この数が非常に大きい場合、または任意の時点でメモリに保持したい数よりも大きい場合は、直接参照ではなくリポジトリとの関連付けを実装することを検討してください。つまり、Organization クラスはスタッフ コレクションを直接参照せず、スタッフ コレクションをリポジトリで取得する必要があります。詳細については、こちらをご覧ください。

また、StaffMember と Organization 間の関連付けなど、双方向の関連付けにも注意してください。モデル化にはコストがかかりませんが、実装にはコストがかかります。基本的に、逆の関係が必要ないようにシステムを設計してみてください。

于 2012-08-29T18:29:16.897 に答える