我应该在自相关表中使用BELONGS_TO,HAS_ONE吗?

时间:2013-10-24 00:58:19

标签: yii

我有一张桌子'人'与一对多的自我关系,'母亲'和'父亲',当然他们是人。所以'person'表有两个可选字段,'mother_id'和'father_id'指向同一个表中的其他行。

我应该使用BELONGS_TO,HAS_ONE吗?

重要的是要说母亲和父亲是选择权,就系统而言,孤儿是一个有效的实体,当然,母亲或父亲除了指出他/她是父亲的现存者之外没有特别的区别/母亲。

同样重要的是要提到,因为系统与了解某个人的孩子无关,所以只知道某个人的父母。

2 个答案:

答案 0 :(得分:2)

你可以使用这样的组合:

return array(
    'father' => array(self::BELONGS_TO, 'Person', 'father_id'),
    'mother' => array(self::BELONGS_TO, 'Person', 'mother_id'),
    'mothersChildren' => array(self::HAS_MANY, 'Person', 'mother_id'),
    'fathersChildren' => array(self::HAS_MANY, 'Person', 'father_id'),
);

所以你想要一个HAS_MANY而不是HAS_ONE给你的孩子,因为每个人可能有一个以上的孩子。

你也看到,有问题的关系是子关系:你必须使用像LEFT JOIN person c ON t.mother_id=c.id OR t.father_id=c.id这样的JOIN,你不能用Yii的关系来定义。因此,您可以定义两个关系并编写一个类似getChildren()的getter来创建mothersChildrenfathersChildren关系上的联合。

答案 1 :(得分:1)

BELONGS_TO通常用于反向关系(child => parent),而HAS_ONE用于forward-relation(parent => child)。因此,在我的建议HAS_ONE中,你最好的选择。

本案例中的另一个重要概念是Weak Entity的概念。没有Weak Entityparentstrong entity不存在。每当您从Weak Entity转发回Strong Entity时,在其他情况下始终使用BELONGS_TOHAS_ONE

弱实体示例:UserProfile

User HAS_ONE UserProfile

UserProfile BELONGS_TO A User

如果没有UserProfile记录,则记忆User不存在,因此其实体较弱。

在你的情况下,我不确定你说one to many, 'mother' and 'father'

的时间

然而,一些可能的关系可能是:

  1. 人:妈妈:: 1:1
  2. 人:父亲:: 1:1
  3. 人:儿童:: 1:M
  4. 如果您正在谈论第三种情况,则关系将为BELONGS_TO