Я розробляю додаток, в якому потрібно буде зберігати вбудовані , інтекстні метадані. Я маю на увазі під собою таке: скажімо, у нас довгий текст, і ми хочемо зберегти деякі метадані, пов'язані з певним словом або пропозицією тексту.
Який найкращий спосіб зберігати цю інформацію?
Моя перша думка полягала в тому, щоб включити до тексту якийсь 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.
Це призведе до двох проблем, про які я можу придумати:
- Відносно мало, що якщо згаданий синтаксис випадково потрапив у згаданий текст, він може зіпсуватися з розбором.
- Найголовніше те, що це не підтримує ці метадані окремо від самого тексту.
Я хотів би мати дискретну структуру даних для зберігання цих даних, таку іншу таблицю БД, в якій зберігаються ці метадані, щоб я міг їх використовувати дискретно: запити, статистика, сортування тощо.
EDIT: Оскільки відповідь видалив свою відповідь, я думаю, що було б добре додати тут свою пропозицію, оскільки це було корисною пропозицією, яка поширилася на цій першій концепції. Плакат запропонував використовувати аналогічний синтаксис, але пов'язати метадані 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
Таким чином метадані мали б унікальний ідентифікатор, a text_idяк зовнішній ключ, підключений до таблиці, що зберігає тексти, і він би з'єднував дані з самим текстом, використовуючи простий діапазон зміщення символів .
Це дозволило б зробити фокус збереження даних відокремлених від метаданих , але проблема, яку я одразу бачу при такому підході, полягає в тому, що текст не можна редагувати . Або, якщо я хотів реалізувати редагування тексту після передачі майна метаданих, я б в основному доведеться розраховувати символи доповнення або видалення по порівнянні з попередньою версією, і перевірити , є чи кожен додає цій модифікації або видалити символи до або після кожного пов'язаних метаданих.
Що, на мене, звучить як справді неелегантний підхід.
Чи є у вас вказівки чи пропозиції щодо того, як я міг би підійти до проблеми?
Редагувати 2: деякі проблеми з XML
Додамо ще один випадок, який би став цілком необхідним для цього поділу даних та метаданих.
- Скажімо, я хочу зробити це можливим для різних користувачів різні набори метаданих одного тексту , з або без можливості кожного користувача фактично відображати метадані іншого користувача.
Будь-яке рішення уцінки виду (або HTML або XML) буде важко реалізувати в цій точці. Єдиним рішенням у цьому випадку, про який я міг би подумати, було б мати ще одну Таблицю БД, яка містила б єдину користувацьку версію оригінального тексту, підключення до початкової таблиці тексту за допомогою 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>, consectetuer adipiscing elit</comment>,<note content="adversative?">sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.<note content="funny latin"></note></note>
Тут у нас є дві різні проблеми:
Різні елементи, що перетинаються: Перший коментар починається в першій ноті, але закінчується після закінчення першої ноти, тобто це не її дочірня.
Ті ж елементи, що перекриваються: остання нота та жирна нота перекриваються; однак, оскільки вони є тим самим елементом, аналізатор закрив би останній відкритий елемент при першому закритті, а перший відкритий елемент при останньому замиканні, що, за цією обставиною, не є тим, що призначено.