Sto sviluppando un'applicazione che dovrà archiviare metadati in - line e in- text . Quello che intendo con questo è il seguente: diciamo che abbiamo un lungo testo e vogliamo memorizzare alcuni metadati collegati a una parola specifica o frase del testo.
Quale sarebbe il modo migliore per conservare queste informazioni?
Il mio primo pensiero è stato quello di includere nel testo una sorta di Markdown
sintassi che sarebbe poi analizzata al momento del recupero. Qualcosa simile a questo:
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.
Ciò introdurrebbe due problemi a cui posso pensare:
- Uno relativamente piccolo, è che se detta sintassi si trova casualmente sul detto testo, può fare confusione con l'analisi.
- Il più importante è che questo non mantiene questi metadati separati dal testo stesso.
Vorrei avere una struttura di dati discreta per contenere questi dati, una tabella DB così diversa in cui sono archiviate queste metadate, in modo da poterle utilizzare in modi discreti: query, statistiche, ordinamento e così via.
EDIT: Dal momento che il risponditore ha eliminato la sua risposta, penso che potrebbe essere utile aggiungere il suo suggerimento qui, poiché è stato un suggerimento praticabile che si è esteso su questo primo concetto. Il poster ha suggerito di utilizzare una sintassi simile, ma di collegare i metadati alla tabella PRIMARY KEY
del metadata
database.
Qualcosa che assomiglierebbe a questo:
Lorem ipsum dolor sit amet, consectetuer adipiscing elit,
sed diam __nonummy nibh__[15432]
euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
Dove 15432
si trova la ID
riga di una tabella contenente le informazioni necessarie e interrogabili, come nell'esempio seguente.
Il mio secondo pensiero è stato quello di memorizzare informazioni di questo tipo in una tabella DB simile a questa:
TABLE: metadata
ID TEXT_ID TYPE OFFSET_START OFFSET_END CONTENT
1 lipsum note 68 79 this sounds really funny latin
In questo modo i metadati avrebbero un ID univoco, a text_id
come una chiave esterna collegata alla tabella che memorizza i testi e collegherebbe i dati con il testo stesso usando un semplice intervallo di offset dei caratteri .
Questo farebbe il trucco di mantenere i dati separati dai metadati , ma un problema che posso immediatamente vedere con questo approccio è che il testo non sarebbe sostanzialmente modificabile . Oppure, se volessi implementare la modifica del testo dopo l'assegnazione dei metadati, dovrei sostanzialmente calcolare le aggiunte o la rimozione dei caratteri rispetto alla versione precedente e verificare se ciascuna di queste modifiche aggiunge o rimuove i caratteri prima o dopo ogni dei metadati associati.
Il che, per me, sembra un approccio davvero poco elegante.
Hai qualche suggerimento o suggerimento su come potrei affrontare il problema?
Modifica 2: alcuni problemi XML
Aggiungendo un altro caso che renderebbe del tutto necessario per far avvenire questa separazione di dati e metadati.
- Diciamo che voglio rendere possibile a diversi utenti di avere diversi set di metadati dello stesso testo , con o senza la possibilità che ciascun utente visualizzi effettivamente i metadati degli altri utenti.
Qualsiasi soluzione del tipo markdown (o HTML o XML) sarebbe difficile da implementare a questo punto. L'unica soluzione in questo caso a cui potrei pensare sarebbe quella di avere ancora un'altra tabella DB che conterrebbe la versione per singolo utente del testo originale, collegandosi alla tabella di testo originale mediante l'uso di a FOREIGN KEY
.
Non sono sicuro che sia molto elegante.
- XML ha un modello di dati gerarchico: qualsiasi elemento che si trova all'interno dei confini di un altro elemento è considerato come suo figlio , il che spesso non è il caso del modello di dati che sto cercando; in XML qualsiasi elemento figlio deve essere chiuso prima che il tag padre possa essere chiuso, evitando sovrapposizioni di elementi.
Esempio:
<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>
Qui abbiamo due diversi problemi:
Diversi elementi sovrapposti: il primo commento inizia all'interno della prima nota, ma termina dopo la fine della prima nota, ovvero non è suo figlio.
Stessi elementi sovrapposti: l'ultima nota e la nota in grassetto si sovrappongono; tuttavia, poiché sono lo stesso tipo di elemento, il parser chiuderebbe l'ultimo elemento aperto alla prima chiusura, e il primo elemento aperto all'ultima chiusura, che, in questa circostanza, non è quello che si intende.