0

我正在创建一个 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 表还是 page_version 表?同样,这将链接到页面而不是版本。如果有人编辑页面的某个版本并添加了重写规则,这将应用于该页面,而不仅仅是该页面的版本。即,如果您要恢复到旧版本,重写规则仍将适用于该版本。
  3. 要使页面版本成为活动页面,这应该是页表中的简单字段还是 page_version 表中的简单字段?

    谢谢

    更新

这是我的 Page 和 PageVersion 类:

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

}
4

1 回答 1

1

考虑到版本关联从长远来看真的很烦人。此外,您可能应该删除OneToMany关系并仅保留ManyToOne它们的一侧。

这使得使用像EntityAudit这样的工具更容易对数据进行版本控制,不幸的是,这在我的情况下不起作用(不支持继承)。

所以我的建议是:

  1. 如果它与版本属性无关,则不要这样做。版本控制是一个复杂的问题,也是一个昂贵的问题。雅尼。
  2. 如果你想跟踪一个页面过去是否有重写规则,你需要对关联进行版本化,但是由于重写规则对每个版本没有影响,YAGNI。在我看来,您可能只是将页面与重写连接(也在这里:如果可能,保持关联单向)。
  3. 您可能需要引用“页面”对象中的“活动”页面。这大大加快了查询速度,并且使您更容易使用 OOP API。
于 2013-02-08T19:57:02.250 回答