代码之家  ›  专栏  ›  技术社区  ›  Etzeitet

如何在数据库中存储文章或其他大型文本

  •  34
  • Etzeitet  · 技术社区  · 16 年前

    我目前正在设计一个数据库驱动的网站。主要原因是为了学习的目的,但我不会说谎,有一小部分虚荣包括在内!

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

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

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

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

    我在这里写了很多关于这个简单问题的文章,所以我将把它分解为:

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

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

    感谢您的时间:)

    4 回复  |  直到 7 年前
        1
  •  20
  •   Byron Whitlock    16 年前

    按照Alex的建议,将所有内容存储在一个大文本字段中。搜索时,不要敲打数据库,使用 Lucene htdig 创建输出的索引。这样搜索速度非常快。副作用是你让你的搜索引擎更友好一点;你把你的关键字字段(如反斜杠建议的那样)粘贴在meta-keywords属性中。

    编辑

    除非你只搜索关键词,让数据库做搜索会非常慢(搜索过论坛,而且要花很长时间吗?)。数据库无法索引

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

    寻找一篇文章是令人沮丧的,搜索没有返回你正在寻找的结果,因为它们不在关键字字段中!htdig允许您高效地搜索文章的全文。您的搜索将立即返回,文章中的每个术语都是完全可搜索的。将关键字放在元标记中会使搜索结果页面中这些术语的搜索率更高。

    另一个好处是模糊匹配。如果搜索“activate”,htdigg将匹配具有active、activation、activity等(可配置)的页面。或者,如果用户拼错了一个单词,它仍然会匹配。你希望你的用户有一个类似谷歌的体验,而不是一个烦人的体验。:)

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

    另外,htdig也会对非数据库页面进行爬行,这样整个站点就可以通过相同的简单界面进行搜索。

    对于关键字字段,您 应该 有一个单独的表,名为keywords,具有文章的ID和关键字字段(每行1个关键字)。但是为了简单起见,在数据库中使用一个字段并不是一个糟糕的主意,如果您将它放在一个表单中,那么更新关键字就非常容易了。

    如果你不想为这一切烦恼,你可以尝试使用 Google custom search . 它的工作要少得多,但您不能保证所有页面都会被索引。

    祝你好运!

        2
  •  9
  •   Slepice1 backslash17    7 年前

    为了存储大量文本(64 kbytes到4 gbytes,具体取决于RDBMS),创建了文本、bigtext、longext和其他数据类型字段。它们只是创建一个二进制指针来定位数据库中的文本,而不是直接存储在表中。如果将路径存储在varchar字段中以定位文档,则几乎是相同的过程,但是将其存储在数据库中可以更容易地进行维护,因为如果删除行,则文档将随该行一起消失,而无需在其他过程中删除它(就像存储为文件一样)。从逻辑上讲,这会使您的数据库更大,有时备份和传输起来也不那么容易,但是逐个传输文档会非常繁琐和缓慢。

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

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

        3
  •  3
  •   Alex Martelli    16 年前

    根据您对所有内容的安排和安装方式,很难从远程客户机访问外部文件,而远程客户机可以很好地访问数据库——那么,为什么不将所有XML保存到一个文本字段中呢?如果DB引擎不能很好地处理该负载,您可以重构一些东西,以便稍后对其进行优化,但这是最简单的启动方法。

        4
  •  2
  •   John Turnbull    16 年前

    快速查看本机XML DBS。有几个,一些非常好的是免费的。

    搜索存在,文档xdb,Oracle Berkeley。

    如果您坚持、查询和更新半结构化的文本,并且结构有任何深度,那么如果您坚持使用指针的RDB,或者使用点技术(stuff-it-in-a-blob技术),那么您几乎肯定是在做这件事——尽管有许多外部原因表明这些架构是必要的和成功的。

    在提交设计之前,先阅读一下xpath和xquery。这里是一个很好的起点: https://community.emc.com/community/edn/xmltech