我想要做的是创建一个人可以拥有的角色层次。并使用Doctrine和Symfony2执行此操作。
层次结构的顶部是 person 。从人的角度来看,有一个名为employee的子类和两个名为 it_user 和 telephony_user 的子类。其中每一个都向基类人员添加了几个属性。
如果我理解正确,使用单表继承,对于同一个人,我会有不同的行(一个是rol / subclass)。
我想为同一个人创建相同的行,并使用每个类/子类管理属性的某个子集。
问题:
单表继承是一个很好的方法吗?任何调整?
或者更好的是一个名为person的超类的经典方式,它具有所有角色的所有属性的聚合?
其他任何方式都更好吗?
提前谢谢。
答案 0 :(得分:0)
如果您计划根据人员类型设置不同的属性,则应使用 Class Table Inheritance。此继承允许您进行以下操作:
超类:
Person
- name
- gender
子类1:
Employ extends Person
- manager
- projects
子类2:
TelephonyUser extends Person
- schedule
- foo
- bar
通过这种方式,每个模型(子类)都映射到其表。了解每个子类如何相互具有自定义属性并同时共享父属性。
查看以下数据库模式:
-- Uploads table
id | name | size | type | filename
------------------------------------------
1 | upload1 | 43423 | image | foo.gif
2 | upload2 | 64234 | file | hack.txt
3 | upload3 | 76646 | image | bar.gif
根据类型列,文件和图片是上传类的两个子类。如您所见,它们都具有相同的属性,可以处理子类类型。为什么?因为这种继承是基于行为模型而不是结构的明智之举。例如,您可以为每个类不同地管理属性数据:
// In file class the content as text should be showen
class File extends Uploads{
// show the file content
public function show(){
echo file_get_contents( $this->filename );
}
}
// In Image class the image should be showen
class File extends Uploads{
// show the file content
public function show(){
echo "<img src='{ $this->filename }' alt='' />";
}
}
了解每个具有相同属性的类如何管理它们彼此不同。但最相关的是所有数据都将存储在unique table
中。因此,您需要做的是为db squema建模以应用适当的继承。