В каком виде хранить текст книги в БД, и какую БД (реляционную/не реляционную) для этого лучше использовать?

Делаю некоммерческий пэт-проект, просто для души. Выглядеть он будет как сайт-читалка для конкретной книги, где можно будет делать сноски и пояснения к различным местам в тексте. Из необходимого функционала:

  1. ссылки, которые генерируются на конкретное место в тексте
  2. возможность делать сноски на абзац, на небольшую последовательность слов, на одно слово
  3. Возможность разделять текст на главы и страницы на фронте

Здесь и появляются несколько вопросов:

  1. Как хранить текст самого произведения (построчно, побуквенно, по главам), может быть нужна какая-то многоуровневая кластеризация?
  2. Как хранить сноски, а именно привязку к конкретному месту в тексте, к слову или абзацу? А из всего этого вытекает:
  3. Какую БД под такое подобрать?

Покопался немного, но только в голову не приходит ничего кроме как к каждому слову сгенерировать хэш и потом как-то по хэшу/набору таких хэшей искать последовательность слов, а после уже отрисовывать блок-выделение для текста, к которому уже будут крепиться сноски. Еще читал, что вроде mongoDB под такое можно взять, но как хранить данные всё же не ясно. Может быть у кого-то был подобный опыт или просто задача покажется интересной с архитектурной точки зрения и будет не лень будет подкинуть мне почву для размышлений, какую-нибудь статью или книгу.

Примерная визуализация страницы со сноской: pic


Ответы (2 шт):

Автор решения: Alik 46
  1. Лучше всего разбить по абзацам, так как в дальнейшем наверняка придется делать пагинацию. И грузить большое количество текста одним запросом будет трудно.
  2. Лучше всего прямо в тексте и уже при выводе его обрабатывать.
    Пример: (%% "СЛОВО ИЛИ АБЗАЦ" : "ТЕКСТ ЕГО СНОСКИ" : "ЦВЕТ ЕГО СНОСКИ" %%)
    В данном случае "(%%" , "%%)" и ":" - просто разделители, которые при выводе текста ты сможешь обработать уже на клиентской стороне.
  3. Можно присмотреться к Postgres или к MongoDB
→ Ссылка
Автор решения: ganz

Предлагаю хранить текст не в базе, а в файле: чтение с диска будет быстрее, меньшая нагрузка на базу, проще править метки, исходный текст в полной сохранности. В базе хранить лишь инструкции для обработки текста. То есть производится чтение с диска допустим с первого по сотый байт. Делается запрос в базу select marks from table where name=name and position>first_byte and position<last_byte Далее обрабатываем результаты и выводим их. Результаты предпочтительнее обрабатывать javascript'ом чтобы снизить нагрузку на сервер.

→ Ссылка