インライン、テキストのメタデータを保存する必要があるアプリケーションを開発しています。つまり、長いテキストがあり、特定の単語またはテキストの文に関連するメタデータを保存するとします。
この情報を保存する最良の方法は何でしょうか?
私が最初に考えたのは、テキストを検索するときに解析される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.
これにより、私が考えることができる2つの問題が発生します。
- 比較的小さいのは、前述の構文が偶然にも前述のテキストにあった場合、構文解析を混乱させる可能性があるということです。
- 最も重要なのは、このメタデータがテキスト自体とは別に維持されないことです。
クエリ、統計、並べ替えなどの個別の方法でそれらを使用できるように、これらのメタデータが格納されている異なるDBテーブルなど、このデータを保持する個別のデータ構造が必要です。
編集:回答者が答えを削除したので、この最初の概念を拡張した実用的な提案だったので、ここに彼の提案を追加するのが良いと思います。ポスターは似た構文を使用するが、これにメタデータをリンクすることが示唆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
以下の例のように、必要に応じて、照会可能な情報を含むテーブルの行の。
私の2番目の考えは、このような情報を次のようなDBテーブルに保存することでした。
TABLE: metadata
ID TEXT_ID TYPE OFFSET_START OFFSET_END CONTENT
1 lipsum note 68 79 this sounds really funny latin
この方法では、メタデータは一意のIDを持ちtext_id
、テキストを格納するテーブルに接続された外部キーとして、単純な文字オフセット範囲を使用してデータをテキスト自体に接続します。
これは維持のトリック行うだろうデータから分離されたメタデータを、私はすぐにこのアプローチを見ることができるという問題は、テキストが根本的になることで編集することはできません。私は、メタデータの逢引後のテキストの編集を実装したい場合は、私は基本的に以前のバージョンに比べて文字の追加、または削除を計算し、かどうかを確認する必要がありますそれぞれ、この変更の前または後に削除文字を追加したり、各関連するメタデータの。
私には、これは本当に違法なアプローチのように聞こえます。
この問題にどのようにアプローチできるかについての指針や提案はありますか?
編集2:いくつかのXMLの問題
このデータとメタデータの分離を行うために非常に必要になる別のケースを追加します。
- 各ユーザーが実際に他のユーザーメタデータを表示するかどうかにかかわらず、異なるユーザーが同じテキストの異なるメタデータセットを持つことができるようにしたいとしましょう。
この時点では、マークダウンの種類のソリューション(またはHTML、XML)の実装は困難です。私が考えることができるこの場合の唯一の解決策は、元のテキストのシングルユーザーバージョンを含む別のDBテーブルを持ち、を使用して元のテキストテーブルに接続することです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>
ここには2つの異なる問題があります。
重複するさまざまな要素:最初のコメントは最初の音符内で始まりますが、最初の音符の終わりで終了します。つまり、子ではありません。
重複する同じ要素:最後の音符と太字の音符が重なります。ただし、これらは同じ種類の要素であるため、パーサーは最初のクロージャーで最後に開かれた要素を閉じ、最後のクロージャーで最初に開かれた要素を閉じますが、この状況では意図されていません。