Я разрабатываю приложение , которое нужно будет хранить рядный , Intext метаданных. Под этим я подразумеваю следующее: допустим, у нас есть длинный текст, и мы хотим сохранить некоторые метаданные, связанные с определенным словом или предложением текста.
Как лучше всего хранить эту информацию?
Моей первой мыслью было включить в текст некий Markdown
синтаксис , который затем будет проанализирован при извлечении. Что-то похожее на это:
Lorem ipsum dolor sit amet, consectetuer adipiscing elit,
sed diam __nonummy nibh__[@note this sounds really funny latin]
euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
Это может привести к двум проблемам:
- Относительно небольшим является то, что если указанный синтаксис случайно оказался в указанном тексте, он может испортить синтаксический анализ.
- Наиболее важным является то, что это не поддерживает эти метаданные отдельно от самого текста.
Я хотел бы иметь дискретную структуру данных для хранения этих данных, такую как другая таблица БД, в которой хранятся эти метаданные, чтобы я мог использовать их по-разному: запросы, статистика, сортировка и так далее.
РЕДАКТИРОВАТЬ: Поскольку ответчик удалил свой ответ, я думаю, что было бы неплохо добавить его предложение здесь, так как это было реальное предложение, которое расширило эту первую концепцию. Плакат предложил использовать подобный синтаксис, но связать метаданные к PRIMARY KEY
из metadata
таблицы базы данных.
Нечто похожее на это:
Lorem ipsum dolor sit amet, consectetuer adipiscing elit,
sed diam __nonummy nibh__[15432]
euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
Где 15432
будет находиться ID
строка таблицы, содержащая необходимую запрашиваемую информацию, как показано в примере ниже.
Моя вторая мысль заключалась в том, чтобы хранить информацию такого рода в таблице БД, которая выглядит следующим образом:
TABLE: metadata
ID TEXT_ID TYPE OFFSET_START OFFSET_END CONTENT
1 lipsum note 68 79 this sounds really funny latin
Таким образом, метаданные будут иметь уникальный идентификатор, text_id
как внешний ключ, связанный с таблицей, в которой хранятся тексты, и он будет связывать данные с самим текстом, используя простой диапазон смещения символов .
Это позволило бы отделить данные от метаданных , но проблема, которую я сразу вижу при таком подходе, заключается в том, что текст в принципе не подлежит редактированию . Или, если бы я захотел осуществить редактирование текста после назначения метаданных, мне пришлось бы в основном рассчитывать добавление или удаление символов по сравнению с предыдущей версией и проверять, добавляет ли каждая из этих модификаций символы или удаляет их до или после каждого из них. связанных метаданных.
Что для меня звучит как по-настоящему не элегантный подход.
Есть ли у вас какие-либо указания или предложения о том, как я мог бы подойти к проблеме?
Редактировать 2: некоторые проблемы с XML
Добавление еще одного случая, который сделал бы совершенно необходимым для такого разделения данных и метаданных.
- Допустим, я хочу, чтобы разные пользователи могли иметь разные наборы метаданных одного и того же текста , с возможностью или без возможности каждого пользователя фактически отображать метаданные другого пользователя.
Любое решение типа уценки (или HTML, или XML) было бы трудно реализовать на данном этапе. Единственное решение в этом случае, о котором я мог подумать, - это иметь еще одну таблицу БД, которая будет содержать однопользовательскую версию исходного текста, соединяющуюся с исходной текстовой таблицей с помощью a FOREIGN KEY
.
Не уверен, что это очень элегантно.
- У XML есть иерархическая модель данных: любой элемент, который оказывается в границах другого элемента, рассматривается как его дочерний элемент , что чаще всего не соответствует той модели данных, которую я ищу; в XML любой дочерний элемент должен быть закрыт до того, как родительский тег может быть закрыт, не допуская перекрытия элементов.
Пример:
<note content="the beginning of the famous placeholder">
Lorem ipsum dolor sit<comment content="I like the sound of amet/elit">
amet</note>
, посвященный адептированию elit</comment>
,<note content="adversative?">
sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.<note content="funny latin">
</note>
</note>
Здесь у нас есть две разные проблемы:
Различные элементы перекрываются: первый комментарий начинается в первой заметке, но заканчивается после окончания первой, т. Е. Это не его дочерний элемент.
Одинаковые элементы перекрываются: последняя нота и полужирная нота перекрываются; однако, поскольку они являются элементом одного типа, синтаксический анализатор закроет последний открытый элемент при первом закрытии, а первый открытый элемент - при последнем закрытии, что в данном случае не является тем, что предназначено.