Estou desenvolvendo um aplicativo que precisará armazenar metadados em linha e intext . O que quero dizer com isso é o seguinte: digamos que temos um texto longo e queremos armazenar alguns metadados conectados a uma palavra ou sentença específica do texto.
Qual seria a melhor maneira de armazenar essas informações?
Meu primeiro pensamento foi incluir no texto algum tipo de Markdown
sintaxe que seria analisada na recuperação. Algo parecido com isto:
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.
Isso introduziria dois problemas que posso pensar:
- Uma relativamente pequena, é que, se a referida sintaxe estiver fortuitamente no texto mencionado, ela poderá interferir na análise.
- O mais importante é que isso não mantém esses metadados separados do próprio texto.
Eu gostaria de ter uma estrutura de dados discreta para armazenar esses dados, uma tabela de banco de dados diferente na qual esses metadados são armazenados, para que eu possa usá-los de maneiras distintas: consultas, estatísticas, classificação e assim por diante.
EDIT: Como o respondente excluiu sua resposta, acho que seria bom adicionar sua sugestão aqui, pois foi uma sugestão viável que se expandiu nesse primeiro conceito. O pôster sugeriu usar uma sintaxe semelhante, mas vincular os metadados à tabela PRIMARY KEY
do metadata
banco de dados.
Algo que seria assim:
Lorem ipsum dolor sit amet, consectetuer adipiscing elit,
sed diam __nonummy nibh__[15432]
euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
Onde 15432
seria a ID
linha de uma tabela que contém as informações necessárias e passíveis de consulta, como no exemplo abaixo.
Meu segundo pensamento foi armazenar informações desse tipo em uma tabela de banco de dados assim:
TABLE: metadata
ID TEXT_ID TYPE OFFSET_START OFFSET_END CONTENT
1 lipsum note 68 79 this sounds really funny latin
Dessa maneira, os metadados teriam um ID exclusivo, text_id
como uma chave estrangeira conectada à tabela que armazena os textos e conectaria os dados ao próprio texto usando um intervalo simples de deslocamento de caracteres .
Isso faria o truque de manter os dados separados dos metadados , mas um problema que posso ver imediatamente com essa abordagem é que o texto seria fundamentalmente não editável . Ou, se eu quisesse implementar a edição do texto após a atribuição dos metadados, basicamente precisaria calcular adições ou remoção de caracteres em comparação com a versão anterior e verificar se cada uma dessas modificações adiciona ou remove caracteres antes ou depois de cada dos metadados associados.
O que, para mim, parece uma abordagem realmente deselegante.
Você tem alguma sugestão ou sugestão de como eu poderia abordar o problema?
Edit 2: alguns problemas de XML
Adicionar outro caso que tornaria bastante necessário para essa separação de dados e metadados.
- Digamos que eu queira possibilitar que diferentes usuários tenham diferentes conjuntos de metadados do mesmo texto , com ou sem a possibilidade de cada usuário realmente exibir os outros metadados do usuário.
Qualquer solução do tipo de remarcação (ou HTML ou XML) seria difícil de implementar neste momento. A única solução nesse caso em que eu poderia pensar seria ter outra tabela de banco de dados que contivesse a versão de usuário único do texto original, conectando-se à tabela de texto original pelo uso de a FOREIGN KEY
.
Não tenho certeza se isso é muito elegante também.
- O XML possui um modelo de dados hierárquico: qualquer elemento que esteja dentro das bordas de outro elemento é considerado filho , o que geralmente não é o caso no modelo de dados que estou procurando; em XML, qualquer elemento filho deve ser fechado antes que a tag pai possa ser fechada, não permitindo sobreposição de elementos.
Exemplo:
<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>
Aqui temos dois problemas diferentes:
Sobreposição de diferentes elementos: O primeiro comentário começa na primeira nota, mas termina após o final da primeira nota, ou seja, não é filho.
Os mesmos elementos se sobrepõem: a última nota e a nota em negrito se sobrepõem; no entanto, como são o mesmo tipo de elemento, o analisador fecharia o último elemento aberto no primeiro fechamento e o primeiro elemento aberto no último fechamento, o que, nessa circunstância, não é o que se destina.