Ваша таблица может быть чем-то вроде
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
, только текст, хранящийся непосредственно в строке).
person
Alex Martelli
schedule
31.05.2009