Php 实体及;symfony2中的数据库设计

Php 实体及;symfony2中的数据库设计,php,database-design,symfony,doctrine,Php,Database Design,Symfony,Doctrine,我正在寻找一些关于数据库设计的建议 我正在symfony2平台上构建一个幻灯片应用程序,我有四种不同类型的幻灯片容器(公司、地理区域、财产和个人监视器)。这是为了组织内容和继承内容(监视器位于属性中,属性是地理区域的一部分等) 现在,在平面PHP上,我只会使用两个表,“containers”和“contents”,并在containers表中放置一个type字段,定义所讨论的容器是否是一个地理区域、属性等,并用FK将每个内容块(即幻灯片)链接到相应的容器 现在,在了解symfony2的实体系统后

我正在寻找一些关于数据库设计的建议

我正在symfony2平台上构建一个幻灯片应用程序,我有四种不同类型的幻灯片容器(公司、地理区域、财产和个人监视器)。这是为了组织内容和继承内容(监视器位于属性中,属性是地理区域的一部分等)

现在,在平面PHP上,我只会使用两个表,“containers”和“contents”,并在containers表中放置一个type字段,定义所讨论的容器是否是一个地理区域、属性等,并用FK将每个内容块(即幻灯片)链接到相应的容器

现在,在了解symfony2的实体系统后,我似乎可以通过将不同的容器类型定义为单独的实体来获得更多的继承,从而能够获取例如geo区域,并自动获取其所有子对象(所有属性,以及属于该属性的所有监视器)在飞行中。但是,我确实希望能够在不同容器和不同容器类型之间切换内容块的“归属”。我感觉这对于所描述的方法来说有点棘手,因为如果内容块必须具有“属于”四种不同实体类型中的任何一种的能力,那么内容块的关系(FK)很可能会有问题

在symfony2世界经验丰富的人也许可以告诉我在这里进行的最明智的方法?

在我们的项目中,我们使用和

它的语法对开发人员非常友好。
spreep
的一大优点是表之间的“假”关系。在您的模式中,只需定义
skipSql=true
标志,就可以省略FK的生成,但一个对象可以通过定义的伪关系与另一个对象一起获取

在您的情况下,它将以如下方式结束:

$containers = ContainerQuery::create()->findByXXX('xxx');
$containers->getFirst()->getContents(); // Will return all joined content for the first container
在对象与相关对象的填充过程中,您获得了使用反向关系的绝佳机会:

$contents = $container->getContents();
$container = $contents->getContainer();

只要在评论中提问,我就会用你需要的任何东西扩展我的答案;)

让我想想。。。首先,您必须以面向对象的方式思考业务模型,而不是将其作为关系数据库。如果您希望一个实体有一个名为
container
的属性,该属性可以是不同的类型(并且具有不同的行为),那么就存在类继承问题。例如,您需要具有childs
GeoArea
的类
Container
,以此类推。然后,需要将层次结构映射到数据库: