CMS中的小部件的MySQL架构

时间:2012-02-04 15:25:56

标签: php mysql database-schema

免责声明:我确信之前已经回复过,但我在SO或Google上找不到任何内容。

所以,我有一个基本上由Page,Region,Widget格式组成的CMS。单个页面可以具有无限制的区域,而区域可以具有无限的窗口小部件。

现在我的架构看起来像这样:

Table: pages
Columns: id, title, uri, ...

Table: regions
Columns: id, page_id, name, title

Table: widget_types
Columns: id, title, active

Table: widget_assignments
Columns: id, region_id, widget_type_id, data 
(data represents content/settings for a specific instance of a Widget)

这适用于简单的小部件。我想要做的是让每个Widget类型拥有自己的表格。例如,一个简单的内容小部件将有一个这样的表:

Table: wt_content
Columns: id, content

更复杂的小部件(例如论坛)的示例可能如下所示:

Table: wt_forums
Columns: id, ...

Table: wt_forum_threads
Columns: id, ...

Table: wt_forum_categories
Columns: id, ...

Table: wt_forum_settings
Columns: id, ...

我知道如何实现这一目标的唯一方法是向table表添加reference_id列和widget_assignments,如下所示:

Table: widget_assignments
Columns: id, region_id, widget_type_id, table, reference_id 

我讨厌的是我每次加载页面时都要做一堆查询。我必须:

  1. 选择当前页面的所有窗口小部件分配和区域(这是一个带连接的查询)
  2. 然后遍历每个小部件分配,并查看实际的小部件。
  3. 这可能是一堆垃圾查询!一定有更好的方法。此时我对任何事情持开放态度。

    感谢。

1 个答案:

答案 0 :(得分:1)

您可以考虑通过浏览器加载来改变您的方法。因此,不要在PHP脚本中生成完整的页面,而只生成带有占位符的基本页面。然后让像JQuery这样的东西加载页面部分。

图片示例:

http://www.appelsiini.net/projects/lazyload

这会向服务器生成更多请求,但会生成非常干净的代码。您的流程如下:

Browser -> index.php -> PHP generates a layout HTML -> browser -> browser requests specific parts needed.

例如,像这样的东西可以解决问题,例如为每个小部件对象运行它。

<div class="widget" widgetUrl="http://mydomain.com/widgets/2322?optionshere">
$(this).load($(this).attr('widgetUrl'));

这将加载单个小部件的内容。所以你的PHP应用程序返回可能非常简单。它只涉及窗口小部件的加载,而不是包含多个小部件的完整页面。

你几乎可以完全使用RESTfull,这也可以减轻所需的代码量。

如果小部件是私有的,您可以考虑添加一个范围,如:

http://mydomain.com/users/123/widgets/2322?optionshere

通过这种方式,您可以实现简单快速的安全性,而不会使应用程序变得更加复杂。