为扩展模型修改数据库

Modify database for extended models

我有这种情况:

我有 Person 的 table(称为 persons)。一个人有一个名字、一个 ID 和一个类型(自然的或法人的)。 然后我有Organization,它当然是一个扩展了Person的法人,并且有manager_idemployees这样的特定字段。 然后我有一个 Authority 这是一个特殊的政府 Organization,所以最后也是一个 Person 并且还有像 decree_number 这样的特殊必填字段(数字和年份构成 Authority) 的法令。

然后我有我的数据库,其中有一个名为 persons 的 table。

我的问题是:我应该为 organizations 创建一个新的 table,然后为 authorities 创建另一个吗?如果不是,我应该如何存储当局或组织所需的新字段而不是个人所需的新字段?

我在一个 Laravel 项目中这样做,我可以:

/* Person.php */
class Person extends Model {
}

/* Organization.php */    
class Organization extends Person {
    protected $table = 'persons';
}

/* Authority.php */    
class Authority extends Organization {
    protected $table = 'persons';
}

是的,创建另一个 table,但不要重复 persons 已有的数据,您可以为此使用关系。

例如,创建一个名为 organizations 的 table 来存储具有 组织 级别的人员。架构可以是:

| person_id (FK to persons.id) | manager_id | other_fields |

然后另一个 table for authorities 存储 authority 级别的人。架构可以是:

| person_id (FK to persons.id) | decree_number | other_fields |

然后在Laravel中创建一个关系,我这里假设是one-to-one关系。

// Person.php

public function organizationProfile()
{
    return $this->hasOne(Organization::class);
}

public function authorityProfile()
{
    return $this->hasOne(Authority::class);
}

public function hasOrganization()
{
    return $this->organizationProfile !== null;
}

public function hasAuthority()
{
    return $this->authorityProfile !== null;
}

设计就像 Person 可以有配置文件(在您的情况下是 OrganizationAuthority)。可能还有其他设计,但这是我想到的。

总之,由于组织权威都是,只有另一个属性,我们刚刚创建了另一个 table 来保存这些属性,但不重复 Person 中已经存在的属性。我们将利用关系来确定 if 一个 Person 只是一个 Person,一个 组织当局.