Я розробляю додаток, в якому потрібно буде зберігати вбудовані , інтекстні метадані. Я маю на увазі під собою таке: скажімо, у нас довгий текст, і ми хочемо зберегти деякі метадані, пов'язані з певним словом або пропозицією тексту.
Який найкращий спосіб зберігати цю інформацію?
Моя перша думка полягала в тому, щоб включити до тексту якийсь 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>
Тут у нас є дві різні проблеми:
Різні елементи, що перетинаються: Перший коментар починається в першій ноті, але закінчується після закінчення першої ноти, тобто це не її дочірня.
Ті ж елементи, що перекриваються: остання нота та жирна нота перекриваються; однак, оскільки вони є тим самим елементом, аналізатор закрив би останній відкритий елемент при першому закритті, а перший відкритий елемент при останньому замиканні, що, за цією обставиною, не є тим, що призначено.