你的桌子可能是这样的
CREATE TABLE ArticleText (
INTEGER artId,
INTEGER wordNum,
INTEGER wordId,
PRIMARY KEY (artId, wordNum),
FOREIGN KEY (artId) REFERENCES Articles,
FOREIGN KEY (wordId) REFERENCES Words
)
这当然可能非常占用空间或速度很慢等,但您需要进行一些测量才能确定(很大程度上取决于您的数据库引擎)。顺便说一句,我希望很清楚 Articles 表只是一个包含由 artId 键入的文章的元数据的表,而 Words 表是一个由 wordId 键入的每篇文章中所有单词的表(试图通过识别已知单词来节省一些空间输入文章时,如果可行的话...)。一个特殊的词必须是“段落结尾”标记,这样可以很容易地识别出来,并且与每个真实的词不同。
如果您确实像这样构建数据,您可以在按页面检索时获得很大的灵活性,并且可以快速更改页面长度,如果您愿意,甚至可以逐个查询。获取页面:
SELECT wordText
FROM Articles
JOIN ArticleText USING (artID)
JOIN Words USING (wordID)
WHERE wordNum BETWEEN (@pagenum-1)*@pagelength AND @pagenum * @pagelength + @extras
AND Articles.artID = @articleid
参数@pagenum、@pagelength、@extras、@articleid 将在查询时插入到准备好的查询中(使用您的数据库和语言之类的任何语法,例如:extras 或编号参数或其他)。
所以我们得到了超出预期页尾的@extras 单词,然后在客户端我们检查这些额外的单词以确保其中一个是段落结尾标记 - 否则我们将执行另一个查询(使用不同的BETWEEN 值)来获得更多。
远非理想,但鉴于您强调的所有问题,值得考虑。如果您可以指望页面长度总是例如100 的倍数,您可以基于 100 个单词的块(并且没有 Words 表,只是每行直接存储的文本)采用这种轻微的变化。