【问题标题】:Database within a database (a la CCK without Drupal)数据库中的数据库(没有 Drupal 的 la CCK)
【发布时间】:2011-06-04 22:22:33
【问题描述】:

我希望构建一个类似于 Drupal 的 CCK 的 Codeigniter 库,尽管它是一个极其简化的版本。我想知道哪种数据库结构最适合实现我的最终目标,最好用以下用例来描述:

界面:

现有内容类型:

  • 页面[编辑类型] [列出所有] [添加新页面]
  • 评级 [编辑类型] [列出所有] [添加新评级]
  • DVD 电影 [编辑类型] [列出所有] [添加新的 DVD 电影]

[创建新的内容类型]

网络开发者点击【创建新的内容类型】:

表单:新的内容类型

输入标题:[_访客评论____________强>]

添加字段:

  • 字段名称:[_名称__________]
  • 字段类型:[文本(](带基本选项的下拉菜单)
  • 必填值:[x]
  • [添加字段]

[保存内容类型]

Web 开发人员添加了几个字段:

表单:新的内容类型

输入标题:[_访客评论____________强>]

当前字段:

  1. 姓名 |文本(
  2. 电子邮件 |文本(
  3. 内容 |文本(
  4. ForPage |页 |必填

添加字段:

  • 字段名称:[_____________ ]
  • 字段类型:[ -choose below- ]​​i>
  • 必填值:[ ]​​i>
  • [添加字段]

[保存内容类型]

网页开发者保存内容类型,系统创建……嗯,究竟是什么?

想法 1: 我可以很容易地让它创建一个带有相应字段的新数据库表(这基本上会形成一个非常基本的 phpmyadmin 系统)——但这是否明智?这不会在数据库中乱扔很多表吗?

想法 2: 或者我可以创建一个“数据库内的数据库”,类似于:

table ContentType (e.g. "Book")
-- id
-- title

table CustomField (e.g. "Author Name")
-- id
-- ContentTypeID (linking the "Author Name" field to the "Book" type)
-- valueType (linking the field to the correct db table of values)

table DBRecord (e.g. "Lord Of The Rings vol.1")
-- id
-- ContentTypeID (linking the LotR record to the "Book" type)

table ValueText128 (e.g. "J.R.R. Tolkien")
-- id
-- DBRecordID (linking the value to the LotR record)
-- CustomFieldID (linking the Tolkien value to the "Author Name" field)
-- value : char(128)

table ValueSmallInt (e.g. "1954")
-- id
-- DBRecordID (linking the value to the LotR record)
-- CustomFieldID (linking the "1954" value to the "Published Year" field)
-- value : smallInt

...and so on, with a table for each of the datatypes

这可能可行,但我怀疑它在实践中可能效率极低,因为整个系统中每种类型的每个项目的每个整数值最终都会出现在同一个大表中 - 每个字符都相同( 128) 价值等。

那么 - 你怎么看? CCK是如何做到的?什么最有效?

【问题讨论】:

    标签: php database orm content-management-system cck


    【解决方案1】:

    通用数据库很难优化性能,特别是如果您根本不对数据的类型、结构和使用施加任何限制。通常,此类系统将存储带有类型 ID 的值,因此为了在数据库中查询,您最终会执行许多连接,而数据库将无法为您优化。

    尝试查看您是否可以在您打算使用此系统的域中识别出一组不同的原型。例如:“Page”、“Rating”、“Media”、“Comment”、“User”等。为这些情况设置固定的架构和实现,但允许特定实例自定义字段的标签以及内容要显示的字段。为了获得更大的灵活性,您还可以提供(有限的)方法来自定义字段验证规则。

    您可以使用自定义定义的通用字段来扩充原型,如您在想法 2 中描述的那样,只要主要内容被固定架构覆盖。

    我认为动态创建临时表会很快造成混乱,并且可能更难调试和支持。如果让动态创建表变得容易,那么以后的修改呢?您可以更改现有表,但迁移旧数据可能非常困难,如果不是不可能的话,具体取决于更改的类型。

    【讨论】:

    • 感谢您的回复。性能点很好 - 我也很怀疑。自然,所有标准内容“原型”都将单独预先创建,因此该系统仅用于允许“特殊”内容类型。
    • 当然,理想的情况是让开发人员直接或通过“Idea 1”类型的接口创建自己的数据库表,然后以老式方式使用这些专用表
    【解决方案2】:

    我发现 Robert Douglass 的一篇文章几乎回答了我的问题:

    What is the Content Construction Kit? A View from the Database

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多