内容管理系统的内容结构

4
我正在开发一个模块化的 CMS,并且一直在思考内容架构的问题。我需要一个灵活的系统,可以方便地创建不同类型的内容。每种内容类型都有一个模块(或其他模块中的方法)来处理它。该模块处理创建、操作和显示内容(视图负责查看内容,而模块提供信息)。每种内容类型都有自己的表格,并不知道其他内容类型的存在。内容和内容类型是存储内容信息的表格。
Contents
---------------------------------------------------------------------------------------
id    slug            content_type_id   in_table_id   language_id  uid       parent_id
1     about-us        1                 1             1            83j8je29  0
2     o-nama          1                 2             2            83j8je29  0
3     first-page      1                 3             1            12j83j28  0
4     prva-strana     1                 4             2            12j83j28  0
5     news            2                 1             1            mSk2919k  0
6     vijesti         2                 2             2            mSk2919k  0
7     breaking-title  3                 1             1            B8392mkA  5
8     vazna-vijest    3                 2             2            B8392mkA  6

Content_types
------------------
id   content_type 
1    page    
2    category   
3    article 

内容表包含内容的slug,内容类型,该类型内容表中内容的ID,语言ID,uid(唯一标识内容,可以轻松配对多语言内容)和父ID。

这是语言表...

Languages
---------------------------
id   friendly_name    sid
1    english          eng
2    hrvatski         cro

这是一个内容类型表格的示例。
Pages
---------------------------------------------------------------
id  title       content                             author_id
1   About Us    This is a page about us blah blah   5
2   O nama      Ovo je stranica o nama              5
3   First Page  Content                             2
4   Prva strana Sadržaj                             3

那么这一切是如何实现的呢?
假设我们访问以下网址:http://www.website.org/en/about-us
  1. 确定语言(英文,en)并查找其ID(为1)
  2. 确定slug(about-us)
  3. 选择语言ID为1且slug为“about-us”的内容
  4. 确定内容类型和in_table_id
  5. 调用负责打开(处理)该类型内容的模块
  6. 模块已加载。 现在找到具有ID 1 的页面并显示它。
另一个例子: http://www.website.org/en/news/breaking-title
  1. 确定语言(英文,en)并查找其ID(为1)
  2. 确定slug(news)
  3. 我们有两个slug(breaking-title)
  4. 现在查找父级为“news”的“breaking-title”slug的内容
  5. 调用负责打开(处理)该类型内容的模块
  6. 模块已加载。 现在找到具有ID 1 的文章并显示它。
如果我们转到http://www.website.org/en/news/,它将确定它是一个类别,并调用负责处理类别的模块并执行所需操作(在这种情况下是显示所有子内容)。
我认为我想出了一个非常灵活的系统,但是由于我不是经验丰富的程序员(我17岁),所以我不太确定,所以我想问一下您对这个概念有何看法?

你能分享一下你对这个主题的学习成果吗?自从你提出这个问题以来已经有一段时间了。 - Adrian Moisa
1个回答

1

我最近成为了将这些类型的数据存储为元数据的粉丝。明显的好处是您可以拥有一个单独的表格来存储所有内容类型,并且(具有5NF规范化的数据库结构)最多只需要两个额外的表格来存储元数据引用和元数据实际值。这允许高度的数据抽象和持久性的通用模型。而所有这些炒作词语都可以转化为更快的开发。

举个例子,Elgg,一种流行的基于PHP的社交网络框架,在这种存储方面做得很好。Flow3,一个概念性但非常整洁的通用PHP开发框架,也使用元数据进行持久性。

元数据方法的最大优点是您可以彻底忘记代码中的SQL语句。如果您拥有正确的持久性抽象,您可以创建持久对象,例如:

$car = new StdClass();
$car->type = 'car';
$car->fuel_required = 'petrol';
$car->engine_cc = 2400;
$car->max_passengers = 5;
$car-save();

你的持久性框架会负责处理save()函数本身,通过迭代对象属性并将它们保存在元数据表中。如果你需要一个所有这些的工作示例,我建议你安装并尝试一下Elgg。你会发现几乎任何类型的新内容都会被插入到同样的3-4个表中。

使用元数据方法存在一些争议,主要是基于性能方面的考虑。不可否认的是,使用这种方法,你的元数据表会很快填满。然而,假设你的索引已经就位,即使在元数据表中有数千万条记录时,你的查询也会给出合理的响应时间。最重要的是,如果你不想随着业务增长而扩展基础架构,你可以转向“Amazon S3”或其他分布式数据存储解决方案来处理你的可扩展性需求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接