Как разделить длинную статью и сохранить ее в базе данных для удобного поиска и подкачки? - PullRequest
4 голосов
/ 01 июня 2009

Предположим, что это длинная статья (скажем, 100 000 слов), и мне нужно написать файл PHP для отображения страницы 1, 2 или 38 страницы статьи,

display.php?page=38

но количество слов для каждой страницы может меняться со временем (например, прямо сейчас, если это 500 слов на страницу, но в следующем месяце мы можем легко изменить его до 300 слов на страницу). Как можно разделить длинную статью и сохранить ее в базе данных?

P.S. Дизайн может быть еще более сложным, если мы хотим отобразить 500 слов, но включить целые абзацы. То есть, если мы уже показываем слово 480, но в абзаце осталось еще 100 слов, то все равно покажите эти 100 слов, даже если оно превышает ограничение в 500 слов. (а затем на следующей странице не должно отображаться эти 100 слов снова).

Ответы [ 6 ]

2 голосов
/ 01 июня 2009

Я бы сделал это, разделив статьи на чуки при их сохранении. Сценарий сохранения разбил бы статью, используя все правила, которые вы разработали, и сохранил каждый кусок в таблицу, подобную этой:

CREATE TABLE article_chunks (
    article_id int not null,
    chunk_no int not null,
    body text
}

Затем при загрузке страницы статьи:

$sql = "select body from article_chunks where article_id = "
    .$article_id." and chunk_no=".$page;

Всякий раз, когда вы хотите изменить логику разбиения статей на страницы, вы запускаете сценарий, который собирает все фрагменты вместе и заново разделяет их:

ОБНОВЛЕНИЕ: Предоставление совета Я полагаю, что ваше приложение интенсивно для чтения, а не для записи, что означает, что статьи читаются чаще, чем пишутся

2 голосов
/ 01 июня 2009

Конечно, вы можете вывести ровно 500 слов на страницу, но лучшим способом было бы поставить какие-то разрывы в вашей статье (конец предложения, конец абзаца). Положите их в местах, где перерыв будет хорошо. Таким образом, на ваших страницах будет не ровно по X слов, а около или до X, и не будет разрываться ни предложения, ни абзацы. Конечно, при отображении страниц не отображайте эти маркеры перерывов.

1 голос
/ 01 июня 2009

Позвольте автору разделить статью на части.

Авторы знают, как сделать статью интересной и читабельной, разделив ее на логические части, такие как «Часть 1 - Установка», «Часть 2 - Конфигурация» и т. Д. Использование алгоритма - плохое решение, имхо. *

Отбрасывание статьи в неправильном месте просто раздражает читателя. Не делай этого.

мой 2 100

/0
1 голос
/ 01 июня 2009

Ваш стол может быть что-то вроде

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, только текст, хранящийся непосредственно в строке).

1 голос
/ 01 июня 2009

Это лучший способ вырезать текст вручную, потому что не стоит оставлять программу, которая определяет, где вырезать. Иногда его обрезают сразу после тега h2 и переходят к тексту на следующей странице.

Это простая структура базы данных для этого:
статья (id, название, время, ...)
article_body (id, article_id, page, body, ...)

SQL-запрос:

SELECT a.*, ab.body, ab.page
FROM article a
INNER JOIN article_body ab
    ON ab.article_id = a.id
WHERE a.id = $aricle_id AND ab.page= $page
LIMIT 1;

В приложении вы можете использовать jQuery для простого добавления новой области текста для другой страницы ...

1 голос
/ 01 июня 2009

Вы можете начать с разбивки статьи на массив абзацев с помощью команды split http://www.php.net/split

$array = split("\n",$articleText);
...