【问题标题】:Content structure for a CMSCMS 的内容结构
【发布时间】:2011-04-16 18:39:22
【问题描述】:

我正在开发一个模块化的 CMS,并且我一直在思考内容架构。我需要一个灵活的系统,可以轻松创建不同的内容类型。每个内容类型都有一个处理它的模块(或其他模块中的方法)。该模块处理创建、操作并帮助显示内容(视图负责查看内容,模块为它们提供信息)。

每个内容类型都有自己的表格,不知道其他内容类型。

Contents 和 Content_types 是负责存储有关内容的信息的表。

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 

Contents 表包含内容的 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. 确定蛞蝓(关于我们)
  3. 选择语言 ID 为 1 的内容并添加“about-us”
  4. 确定内容类型和 in_table_id
  5. 调用负责打开(处理)该类型内容的模块
  6. 模块现已加载。它现在找到 ID 为 1 的页面并显示它。

另一个例子: http://www.website.org/en/news/breaking-title

  1. 确定语言 (en) 并找出它的 ID(即 1)
  2. 确定蛞蝓(新闻)
  3. 我们有两个蛞蝓(break-title)
  4. 现在我们找到带有“break-title”的内容,其父项是“news”
  5. 调用负责打开(处理)该类型内容的模块
  6. 模块现已加载。它现在找到 ID 为 1 的文章并显示它。

如果我们转到http://www.website.org/en/news/,它将确定它是一个类别并调用一个负责处理类别的模块并执行我们需要的操作(在本例中是显示所有子内容)

我想我想出了一个非常灵活的系统,但由于我不是真正有经验的程序员(我今年 17 岁)我不太确定,所以我问你对这个概念有什么看法?

【问题讨论】:

  • 你能分享一下你在这个主题上学到了什么吗?你问这个问题已经有一段时间了。

标签: php content-management-system


【解决方案1】:

我最近喜欢将这些类型的数据存储为metadata。明显的好处是您可以为所有内容类型提供一个表,并且(具有 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”或其他分布式数据存储解决方案来满足您的可扩展性需求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-16
    • 2015-03-27
    • 1970-01-01
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多