Symfony2 + Doctrine对象/数据库映射

时间:2013-02-06 09:42:15

标签: database symfony doctrine mapping entity-relationship

我正在创建一个CMS,我们网站的所有页面都可以添加/更新/删除/重新定位等。我在页面和page_versions之间创建了一个oneToMany关系,所以每次在CMS中修改页面时,副本都会保存为page_version,以便我们可以根据需要恢复到此版本。此外,当有人正在编辑页面时,它将被锁定,因此其他用户无法同时编辑它。每个页面也可以有一个父页面,每个页面可以使用与rewrite_rules表的另一个oneToMany关系具有多个重写规则。但是,在使用Symfony2和Doctrine实体关系进行映射时,我不确定应该使用哪些表以及如何将它们用作对象。以下是我的表格:

page table

id
parent_id
locked

page_version table
page_id
title
content
enabled
position

rewrite_rules table
id
page_id
rewrite
canonical

我的问题是:

  1. 位置字段是否应位于页表或page_version表中?每个页面的位置不会改变,具体取决于页面的版本。这只会在所有页面的列表视图中更改。这样,如果您有“关于我们”页面的5个子页面,可以订购这些子页面以在前端渲染输出。
  2. rewrite_rules表是否应该加入page table或page_version表?同样,这将链接到页面而不是版本。如果某人编辑了某个版本的页面并添加了重写规则,则会将其应用于该页面,而不仅仅是该页面的版本。即如果您要恢复到旧版本,重写规则仍将适用于此版本。
  3. 要使页面版本成为活动页面,这应该是页面表格中还是page_version表格中的简单字段?

    由于

    更新

  4. 以下是我的Page和PageVersion类:

    class Page
    {
        /**
        * @ORM\OneToMany(targetEntity="PageVersion", mappedBy="page")
        */
       private $pageversions;
    }
    
    class PageVersion
    {
        /**
         * @var page
         *
         * @ORM\ManyToOne(targetEntity="Page", inversedBy="pageversions")
         *
         */
        private $page;
    
    }
    

1 个答案:

答案 0 :(得分:1)

考虑到版本控制关联从长远来看变得非常烦人。此外,您应该删除OneToMany关系并仅保留ManyToOne方面的关系。

这样可以更轻松地使用像EntityAudit这样的工具对数据进行版本控制,遗憾的是,这种工具在我的情况下不起作用(不支持继承)。

所以我的建议是:

  1. 如果它与版本属性无关,则不要这样做。版本控制是一个复杂的问题,也是一个昂贵的问题。 YAGNI。
  2. 如果您想要跟踪某个页面是否有过重写规则,您需要对该关联进行版本控制,但由于重写规则没有每个版本的效果,YAGNI。在我看来,你可能只是连接一个页面重写(也在这里:如果可能的话,保持关联是单向的)。
  3. 您可能需要引用“页面”对象中的“活动”页面。这样可以大大加快查询速度,还可以让您更轻松地使用OOP API。