0

我正在构建一个将存储大量文本的数据库系统。

文本将存储在具有 id 列和一个 varchar/text 列的表中。

我想知道使用一个使用大型 varchar 的表或多个表是否更有效,每个表都使用不同的文本类型。

多表选项将包含几个不同的表,每个表使用不同类型的文本(tinytext、text 等),系统将根据文本的长度将文本存储在最合适的表中。

我关心速度和存储空间,并想要一个平衡两者的解决方案。

编辑 -

文本表不会被搜索,但它可能会被连接(通常会确定一个 id 号,然后访问单行)。

大小通常比文本小,但有些会大到需要中等文本。我怀疑是否需要长文本。

4

1 回答 1

1

把事情简单化!严重地。

除非您有绝大多数 255 个字符或更短的文本项,否则只需使用TEXTLONGTEXT。花时间用文本做有趣的事情,而不是摆弄复杂的数据结构。立即完成您的项目;后期优化。

磁盘驱动器和 RAM 变得比您的时间快得多。

如果您的应用程序要求绝对需要您使用 varchar 数据,因为它的简洁性和可搜索性,而不是文本数据,您可以执行以下操作。

创建一个article表格,每篇文章一行。它将包含管理文章所需的所有内容,包括标题、作者和article_id.

创建第二个表,名为article_text. 它可能有四列。

  article_id    foreign key to article table.
  language      a language code, if you happen to store translations of articles
  ordinal       a sequence number
  textfrag    varchar(255)  part of the text.

article_text将每篇文章的文本存储在具有升序ordinal值的一系列行中。每个textfrag文本最多可容纳 255 个字符。要检索文章的文本,您将使用这样的查询。

 SELECT textfrag 
   FROM article_text
  WHERE language = 'en_US'   /* or whatever */
    AND article_id = 23456   /* or whatever */
  ORDER BY ordinal

然后,您将获取一堆行,连接项目的内容textfrag,并且您的文章没有有效长度限制。如果您创建一个包含所有字段的索引,您的检索时间会非常快,因为所有检索都来自索引。

  (article_id, language, ordinal, textfrag)

如果您尽最大努力在单词边界处将文本拆分成片段,并使用 MyISAM,并使用 FULLTEXT 索引,您将获得一个非常有效的全文搜索系统。

于 2013-07-27T19:39:28.583 回答