2012-10-12 39 views
0

我建立了一个微型CMS。使用Mysql作为RDMS,使用Doctrine ORM进行映射。MySQL表关系,继承与否?

我想有两种类型的网页。静态页面和博客页面。 静态页面会将page_url和page_content存储在数据库中。 博客页面将有page_url,但没有page_content。博客将有文章,分类...

可以说我有这样的路线:

/{pageurl} 

这页,配页的URL,可以是家庭,或新闻,或博客... 那页面可以是静态页面,然后我会打印page_content。 但它也可以是博客页面,然后我会打印最新的帖子作为内容。

我应该如何关联这些静态页面和博客页面表格? 这是继承,因为它们都是页面,有它们的URL,但它们有不同的内容? 我是否应该使用继承,以便Static和Blog页面扩展将具有page_url的页面?或者我应该制作另一个表page_types并存储有关可用页面类型的信息?

回答

1

一般,而我用一记MVC框架来讲,当你使用的路线,你将有一个特定的模式,你可以匹配不同的控制器/动作,然后,可以映射到不同的模型和视图。

例如,一个标准的网页URL会格式:

/{pageurl} 

而对于博客页面的网页网址是:

/blog/{pageurl} 

这将使得它很容易区分在两者之间并相应地路由。如果它符合/blog/*的模式,这是一个博客!不过,我们假设您不想采用最简单的方法 - 而是决定让所有网址遵循相同的模式:/{pageurl}。您的实际URL列表应全部存储在数据库中的单个表中,假设名称为site_pages。您site_pagesblogs之间的关系将是blogs列名为page_id这是一个外键回到site_pages表。

有了这个,你有几个方法,你可以决定什么页面类型你看:

  • 一个新列添加到site_pages表,如is_blog;它已设置,你有一个博客!
  • 每次在数据库中查找该页面时,也得到了具体的网页博客条目的count();如果它是> 0,那么你有一个博客页面。否则将其显示为静态内容。
  • 做一个假设,如果page_content是空的,这是一个博客。

一旦建立了页面是静态页面还是博客页面,您可以加载相应的模型 - “页面”或“BlogPage”。由于BlogPage具有相同的用途,因此可以并可能应该扩展Page。两者之间的唯一区别是,“Page”只是加载页面的文本内容,而View只是将其写出。另一方面,“BlogPage”将加载类别,帖子等的列表,并且View会遍历它们并显示它们,但是您认为合适。