В каком виде хранить текст книги в БД, и какую БД (реляционную/не реляционную) для этого лучше использовать?
Делаю некоммерческий пэт-проект, просто для души. Выглядеть он будет как сайт-читалка для конкретной книги, где можно будет делать сноски и пояснения к различным местам в тексте. Из необходимого функционала:
- ссылки, которые генерируются на конкретное место в тексте
- возможность делать сноски на абзац, на небольшую последовательность слов, на одно слово
- Возможность разделять текст на главы и страницы на фронте
Здесь и появляются несколько вопросов:
- Как хранить текст самого произведения (построчно, побуквенно, по главам), может быть нужна какая-то многоуровневая кластеризация?
- Как хранить сноски, а именно привязку к конкретному месту в тексте, к слову или абзацу? А из всего этого вытекает:
- Какую БД под такое подобрать?
Покопался немного, но только в голову не приходит ничего кроме как к каждому слову сгенерировать хэш и потом как-то по хэшу/набору таких хэшей искать последовательность слов, а после уже отрисовывать блок-выделение для текста, к которому уже будут крепиться сноски. Еще читал, что вроде mongoDB под такое можно взять, но как хранить данные всё же не ясно. Может быть у кого-то был подобный опыт или просто задача покажется интересной с архитектурной точки зрения и будет не лень будет подкинуть мне почву для размышлений, какую-нибудь статью или книгу.
Примерная визуализация страницы со сноской:

Ответы (2 шт):
- Лучше всего разбить по абзацам, так как в дальнейшем наверняка придется делать пагинацию. И грузить большое количество текста одним запросом будет трудно.
- Лучше всего прямо в тексте и уже при выводе его обрабатывать.
Пример:(%% "СЛОВО ИЛИ АБЗАЦ" : "ТЕКСТ ЕГО СНОСКИ" : "ЦВЕТ ЕГО СНОСКИ" %%)
В данном случае "(%%" , "%%)" и ":" - просто разделители, которые при выводе текста ты сможешь обработать уже на клиентской стороне. - Можно присмотреться к Postgres или к MongoDB
Предлагаю хранить текст не в базе, а в файле: чтение с диска будет быстрее, меньшая нагрузка на базу, проще править метки, исходный текст в полной сохранности. В базе хранить лишь инструкции для обработки текста. То есть производится чтение с диска допустим с первого по сотый байт. Делается запрос в базу select marks from table where name=name and position>first_byte and position<last_byte Далее обрабатываем результаты и выводим их. Результаты предпочтительнее обрабатывать javascript'ом чтобы снизить нагрузку на сервер.