【问题标题】:Entities & database design in symfony2symfony2 中的实体和数据库设计
【发布时间】:2012-07-29 04:01:31
【问题描述】:

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

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

现在,在平面 PHP 上,我将只使用两个表,“容器”和“内容”,并在容器表中放置一个类型字段,定义相关容器是否为地理区域、属性等。使用 FK 将每个内容片段(即幻灯片)链接到适当的容器。

现在,学习 symfony2 的实体系统,我似乎可以通过将不同的容器类型定义为单独的实体来获得很多继承,从而能够获取例如地理区域,并自动返回所有其子对象(所有属性,以及属于该属性的所有监视器)的动态。然而,我确实希望能够在不同容器和不同容器类型之间切换内容片段的“归属”。我觉得所描述的方法会有些麻烦,如果内容必须具有“属于”四种不同实体类型中的任何一种的能力,那么内容的关系(FK)很可能会出现问题?

在 symfony2 世界中经验丰富的人也许可以启发我了解在这里进行的最明智的路径?

【问题讨论】:

  • 让我看看...首先,您必须以面向对象的方式而不是关系数据库来考虑您的业务模型。如果您希望实体具有名为container 的属性,该属性可以是不同类型(并且具有不同的行为),则存在类继承问题。例如,您需要具有子 GeoArea 的类 Container,依此类推。然后,您需要将层次结构映射到数据库:docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/…

标签: php database-design symfony doctrine


【解决方案1】:

在我们的项目中,我们使用Propel 1.6PropelBundle

它的语法对开发人员非常友好。 Propel 的一大优势是表之间的“假”关系。在您的架构中,只需定义 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();

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-05
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 2014-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多