内容系统中的硬编码URL与嵌套集与组合

时间:2011-09-24 20:49:14

标签: mysql database database-design url-routing content-management-system

我一直在组建一个数据库来处理为网站制作的内容,但是,考虑到长期,我不确定我是否拥有最好的系统。

目前我正在使用路由方法通过index.php传递所有内容.htaccess路由如下index.php?route=example/url(用户看到http://www.domain.com/example/url

目前,数据库的设置如下:

uid            | title        | content | category
--------------------------------------------------
/              | Home         | aaa     | 1
/example       | Example      | bbb     | 2
/example/url   | Example: URL | ccc     | 2

虽然我不确定这是否是最佳方法,特别是如果我想将example重命名为something - 我必须重命名每个网址...

所以我也考虑过嵌套集方法(例如http://www.phpclasses.org/package/2547-PHP-Manipulate-database-records-in-hierarchical-trees.html),虽然这只会在数据库中显示许多不同的数字,我可以通过它的节点访问所有内容。以下示例;

node | left | right | name
--------------------------
1    | 1    | 6     | Home
2    | 2    | 5     | Example
3    | 3    | 4     | URL

然后我可以将节点用作uid?但我不确定如何将http://www.domain.com/example/url翻译成uid等于3 ...

我目前在数据库中已经有了一个类别列,对内容进行分类,但我可能会对此进行更改。

我基本上都在寻找有关如何继续进行的建议,因为随着网站内容越来越多,更改设置将更加困难 - 所以我希望从第一天起就能做到这一点。

  • 两者中哪一个更适合扩展?
  • 如果是第二个,如何将URL翻译成节点?
  • 我可以以某种方式将两者结合起来,以便原始数据库将uid存储为节点号,然后进行某种连接以使uid成为url(如1) - 然后]

    ^我想我更喜欢这个(第三个),但不确定如何在MySQL中完全做到,还有其他一些好处:

    • 我可以用父节点替换我的类别系统 - 这可能更好
    • 我理论上还可以在统计系统中存储节点ID,而不是URL

如果有人能提供一些帮助/建议 - 我将不胜感激!

2 个答案:

答案 0 :(得分:1)

好吧,如果您使用index.php?route=example/url,您可以随时执行以下操作:

$args = explode( '/', $_GET['route'] );
$args = filter_var_array( $_GET['route'], FILTER_SANITIZE_STRING );

那么$ args的值将是:

0 -> example
1 -> url

等。然后,您可以使用这些值来确定要加载的模板,从数据库中获取的内容,或者您​​已经在做的其他内容。

HTH。

答案 1 :(得分:0)

嵌套集模型在这里可能是一个不错的选择。这导致像(id,left,right这样的表布局是嵌套集模型所需的字段,其他包含相应的内容):

| id | left | right | uid | title | content | category |

可以找到有关如何执行特定查询的更多详细信息here

但是我不会在数据库上执行查找,而是执行简单的数组缓存:

new array('/' => array('content' => 'aaa', 'category' => 'bbbb'),
          '/example/' => array(),
          .....
);

这个缓存可以非常容易地构建(虽然价格昂贵)并且很容易查询。

旁注:我怀疑你在这里试图模拟页面内容。也许你应该重构数据库结构,因为这个表有两个职责(url->内容映射和内容)。