Ваш стол может быть что-то вроде
CREATE TABLE ArticleText (
INTEGER artId,
INTEGER wordNum,
INTEGER wordId,
PRIMARY KEY (artId, wordNum),
FOREIGN KEY (artId) REFERENCES Articles,
FOREIGN KEY (wordId) REFERENCES Words
)
это, конечно, может быть очень дорого, или медленно, и т. Д., Но вам понадобятся некоторые измерения, чтобы определить это (так как многое зависит от вашего движка БД). Кстати, я надеюсь, что ясно, что таблица «Статьи» - это просто таблица с метаданными о статьях с ключевыми словами artId, а «Слова» - таблица всех слов в каждой статье с ключевыми словами «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
, только текст, хранящийся непосредственно в строке).