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

时间:2009-07-05 17:47:36

标签: xml database

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

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

我是否将文章文本与所有HTML或BBcode标记一起存储 - 或者更简单的方法是在HTML或XML文档中创建页面并将该文件的路径存储在数据库中?

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

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

我在这里写了很多这么简单的问题,所以我会分解它:

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

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

感谢您的时间:)

4 个答案:

答案 0 :(得分:20)

如Alex建议的那样,在一个大文本字段中存储everthing。要进行搜索,请不要敲打数据库,使用Lucenehtdig创建输出索引。这种方式搜索速度非常快。副作用是让您的搜索更加友好;你拿你的关键字字段(建议使用反斜杠)并将它们粘贴在元关键字属性中。

修改

除非您只搜索关键字,否则让数据库执行搜索的速度非常慢(曾经搜索过一个论坛,它需要FOREVER?)。数据库无法索引

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

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

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

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

此外,htdig还会抓取您的非数据库页面,以便通过相同的简单界面搜索整个站点。

对于关键字字段,应该有一个名为keywords的单独表,其中包含文章的id和关键字字段(每行1个关键字)。但是为了简单起见,在db中使用单个字段并不是一个糟糕的想法,如果将它放在表单中,它会使关键字的更新变得非常简单。

如果您不想为此烦恼而烦恼,可以尝试使用 Google custom search。它的工作要少得多,但您无法保证所有页面都会被编入索引。

祝你好运!

答案 1 :(得分:9)

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

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

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

答案 2 :(得分:3)

根据您安排和安装所有内容的方式,很难从远程客户端访问可以访问数据库的外部文件 - 那么为什么不将所有XML保存到一个TEXT字段呢?如果数据库引擎无法很好地处理该负载,您可以在以后对事物进行重构以进行优化,但这是最简单的入门方式。

答案 3 :(得分:2)

快速浏览一下本机xml数据库。有几个,一些非常好的是免费的。

搜索eXist,Document xDB,Oracle Berkeley。

如果你是持久化,查询和更新半结构化文本,如果结构有任何深度,那么如果你坚持使用RDB指针或者填充它,你几乎肯定会这么做。 -a-blob技术 - 尽管有许多外部原因,这些架构可能是必要且成功的。

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