【问题标题】:Large strings: Text files or SQL DB?大字符串:文本文件还是 SQL DB?
【发布时间】:2010-06-16 21:32:45
【问题描述】:

我正在使用 PHP 编写一个论坛系统。

我目前将线程 ID、标题、作者、视图和其他属性存储在 SQL 数据库中,然后将线程主体(HTML 和 BBcode)存储在以线程 ID 命名的文件夹内的文本文件中。

实际上,获取数据库值然后从文本文件中获取线程主体非常简单,但我想知道这是否是“正确的方式”?我个人对此没有任何问题,但如果结果证明效率非常低,我应该将线程主体 HTML 和 BBcode 都存储在数据库中,然后我会更改。

但是,对我来说,在数据库中存储这样一个(很可能)巨大的多行文本字符串以及许多不同的字符似乎是错误的 - 我被告知数据库更多地用于短字段“值”而不是网站内容。

我只想得到一个明确的答案,因为多年来一直困扰着我,不知道我在哪里做得很好。

有人知道流行的论坛系统是如何存储话题的吗?

已添加 感谢您的回答,所以最好将线程内容存储在数据库中,我应该使用什么字段类型? 还有回复呢?另一个表,其中包含线程 ID 和评论 ID,然后是评论正文? 我是这个数据库的新手,所以感谢您的帮助。

【问题讨论】:

  • Joomla - 所有内容都在数据库中。 Drupal 可能也是。无数系统将内容存储在数据库中。 (请注意,这只是一个统计数据!)
  • 最好针对数据库设计提出一个单独的后续问题。您可以提出的问题数量没有限制,更改标准意味着最初提供答案的人可能会被否决 - 当您更新问题时,我们不会收到提醒。
  • 好的,我明白了,谢谢!

标签: php sql database


【解决方案1】:

Confluence(商业 wiki)将整个页面内容存储在单个列中。

在数据库中存储大文本的原因是:

  1. 值和文本关联的记录之间没有(希望)断开连接
  2. 全文搜索 (FTS) 等技术可以在大量文本中查找特定字符串
  3. 简化的备份和恢复过程

【讨论】:

    【解决方案2】:

    最好将线程存储在数据库中,因为这样可以让您更轻松地进行扩展和搜索。

    如果您想继续使用文件来存储内容,我建议您使用类似于 GridFS 的东西。基本上只是将文件分块并将它们存储在 NOSQL 中。

    【讨论】:

      【解决方案3】:

      我知道 DotNetNuke 和 AspDotNetStorefront 使用数据库来存储此类数据。这些不是论坛,而是内容管理系统和具有内容管理功能的购物车。

      我还尝试了几个论坛(例如YAF),所有这些都使用数据库。就个人而言,我会坚持使用 HTML 数据库,并且任何图像/内容文件都应该存储在磁盘上,并参考它们在 HTML 中的位置。

      也许是在数据库中存储的最有力论据:使用 LIKE 子句搜索文本字段比在文本文件中搜索强项要容易得多。

      另外,有了免费的论坛软件 cout,我能问一下你为什么要从头开始写一个新的吗?我知道可能有充分的理由,但以防万一你还没有想到......

      已添加

      我的大部分参考资料都是 .NET 代码。这是一个用 PHP 编写的开源论坛:http://www.phorum.org/

      【讨论】:

      • 而 LIKE 子句最终可能会非常慢...您可能需要为此使用全文索引。
      • 谢谢。另外,我自己编写代码主要是作为学习练习,它不是一个严肃的网站,所以我想我会自己编写系统代码。
      • 那很好..这是一次很好的学习经历。尽管如此,在某个时候获取 phorum 的源代码并进行比较,看看你的表现如何与他们的表现相比,这可能不是一个太糟糕的主意......查看已建立的代码并将其与你自己的代码进行比较是一个非常好的方法学习方式。玩得开心!
      【解决方案4】:

      这是一个旁白,因为这个问题已经被接受了,但是你应该检查一下 phpbb3 (http://www.phpbb.com/)。非常强大的 php 论坛。可以为您节省一些开发时间:D

      【讨论】:

      • 谢谢,但我编写这个论坛的主要目的是作为我自己的学习练习,否则我会使用 phpbb :)
      【解决方案5】:

      我同意其他答案,将所有数据存储在数据库中简化了扩展、备份/恢复、允许您查询数据等等。

      如果您关心性能,您可以为页面内容实现缓存。我知道 PHPBB 通过在带有过期时间戳的文本文件中包含一个序列化数组来做到这一点。也可以使用 memcached 或其他方式完成。

      将数据存储在数据库中为您提供了最大的灵活性和便利性,大多数与向最终用户提供数据相关的问题都可以通过缓存数据来解决。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-09
        • 1970-01-01
        • 2011-02-09
        • 2012-04-01
        • 1970-01-01
        • 2011-09-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多