【问题标题】:How to store articles or other large texts in a database如何在数据库中存储文章或其他大文本
【发布时间】:2010-11-08 05:49:48
【问题描述】:

我目前正在为自己设计一个数据库驱动的网站。主要是为了学习目的,但我不会撒谎,包括少量的虚荣心!

虽然我相信我的数据库设计到目前为止还不错,但我仍然不能完全确定存储文章或其他大型文本的最佳方式。我知道大多数 DBMS 都具有 TEXT 数据类型或等效数据类型,并且可以保存大量文本。但是,将一篇完整的文章存储为一个长字符串会导致阅读不愉快,因此需要进行格式化。

我是否将文章文本与所有 HTML 或 BBcode 标记一起存储 - 还是直接在 HTML 或 XML 文档中创建页面并将此文件的路径存储在数据库中更好?

我非常喜欢将文章存储为 XML 文档的想法,因为我可以轻松地使用自定义标签标记文章,并使用 PHP 的 XML 和 XSLT 函数将 XML 转换为 HTML [或者实际上是任何其他格式]。它还允许作者指定何时创建换行符/分页符。这种方法当然需要额外的编码[我不害怕],但它确实存在使文章可搜索的问题。

例如,我知道 MySQL 具有用于在文本字段中保存的字符串中搜索特定术语/短语的 SQL 语法。如果我将文本存储在单独的文件中,我该如何让这些文章可搜索?

关于这么简单的问题,我在这里写了很多,所以我将其分解:

1:有没有一种“最佳”方式将大量格式化文本直接存储在数据库中或
2:以 HTML/XML/Whatever 文档的形式保存该文本的路径是否更好。

如果是 2,是否有一种优雅的方法可以使该文本可搜索?

感谢您的宝贵时间:)

【问题讨论】:

    标签: xml database


    【解决方案1】:

    按照 Alex 的建议,将所有内容存储在一个大文本字段中。对于搜索,不要敲击您的数据库,使用Lucenehtdig 来创建输出索引。这种方式搜索速度非常快。副作用是您的搜索对搜索引擎更加友好;您将您的关键字字段(如反斜杠建议的那样)并将它们粘贴在元关键字属性中。

    编辑

    除非您只搜索关键字,否则使用 db 进行搜索会非常缓慢(曾经搜索过论坛并且需要 FOREVER?)。数据库没有办法索引一个

      select.. where FULLTEXTFIELD like '%cookies%'.  
    

    查找文章令人沮丧,但搜索未返回您要查找的结果,因为它们不在关键字字段中! Htdig 允许您有效地搜索文章的全文。您的搜索将立即返回,并且文章中的每个词都是完全可搜索的。将关键字放在元标记中将使对这些字词的搜索在结果页面上更高。

    另一个好处是模糊匹配。如果您搜索“激活”,htdigg 将匹配具有活动、激活、活动等(可配置)的页面。或者如果用户拼错了一个单词,它仍然会被匹配。您希望您的用户拥有类似 Google 的体验,而不是令人讨厌的体验。 :)

    您确实需要一个脚本来创建指向数据库中所有页面的链接列表。让 htdig 自动抓取它,您就不必再考虑它了。

    htdig 还将抓取您的非数据库页面,因此您的整个网站都可以通过相同的简单界面进行搜索。

    至于关键字字段,您应该有一个名为关键字的单独表格,其中包含文章的 id 和一个关键字字段(每行 1 个关键字)。但为简单起见,在 db 中拥有一个字段并不是一个糟糕的主意,如果您将其放入表单中,它会使更新关键字变得非常容易。

    如果您不想大惊小怪,可以尝试使用 Google custom search。它的工作量要少得多,但你不能保证你的所有页面都会被索引。

    祝你好运!

    【讨论】:

    • 哇,谢谢拜伦。您的编辑帮助很大,ht://Dig 似乎没有我想象的那么严格。对于一个拥有数据库的非常小的站点,我敢肯定,搜索并不是什么大不了的事,但我希望如果我的项目适用于我的站点,我可以将它重用于其他人,如果它是可扩展的,那就太好了。但那是为了未来,目前我需要实际编写代码:)
    【解决方案2】:

    创建 TEXT、BIGTEXT、LONGTEXT 和其他数据类型字段是为了存储大量文本(64 KB 到 4 GB,具体取决于 RDBMS)。他们只是创建一个二进制指针来定位数据库中的文本,而不是直接存储在表中。如果您将路径存储在 varchar 字段中以定位文档,则几乎是相同的过程,但是将其保存在数据库中会更容易维护,因为如果您删除该行,文档会随之消失,而无需在其他过程中将其删除(就像您存储为文件一样)。从逻辑上讲,这会使您的数据库变得更大,有时备份和传输也不那么容易,但是逐个传输文档会很乏味且速度很慢。

    如您所见,这取决于数据库中的文档数和行数。

    对于搜索过程,我建议创建一个新的“关键字”字段以加快搜索速度。您也可以搜索文档的前 n 个字符,将它们转换为 CHAR 或 VARCHAR,如果它们还没有特定字段,则将标题和副标题定位到这些数量中。

    【讨论】:

      【解决方案3】:

      快速浏览一下原生 xml 数据库。有好几个,而且一些非常好的是免费的。

      搜索 eXist、Document xDB、Oracle Berkeley。

      如果您要持久化、查询和更新半结构化文本,并且如果该结构有任何深度,那么如果您坚持使用指针的 RDB 或填充式,那么您几乎肯定会以艰难的方式做到这一点-a-blob 技术——尽管有许多外部原因表明这些架构是必要且成功的。

      在进行设计之前,请先阅读一下 XPath 和 XQuery。这是一个很好的起点:https://community.emc.com/community/edn/xmltech

      【讨论】:

        【解决方案4】:

        根据您如何安排和安装所有内容,可能很难从可以正常访问数据库的远程客户端访问外部文件——那么为什么不将所有 XML 保存到一个 TEXT 字段中呢?如果数据库引擎不能很好地处理该负载,您可以重构一些东西以优化它,但这是最简单的开始方式。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-09-03
          • 1970-01-01
          • 2017-03-25
          • 1970-01-01
          • 1970-01-01
          • 2013-01-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多