inline , intext 메타 데이터 를 저장 해야하는 응용 프로그램을 개발 중입니다 . 이것이 의미하는 바는 다음과 같습니다. 긴 텍스트가 있고 특정 단어 또는 텍스트 문장과 연결된 일부 메타 데이터를 저장하려고합니다.
이 정보를 저장하는 가장 좋은 방법은 무엇입니까?
나의 첫 번째 생각 은 텍스트 에 검색 할 때 구문 분석 할 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.
이것은 내가 생각할 수있는 두 가지 문제를 일으킬 것입니다.
- 비교적 작은 것은, 상기 구문이 상기 텍스트 상에 우연히 발생하면, 파싱을 망칠 수 있다는 것이다.
- 가장 중요한 것은이 메타 데이터 가 텍스트 자체 와 별도로 유지되지 않는다는 것입니다.
이 메타 데이터가 저장되는 다른 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
?
내 두 번째 생각은 다음과 같이보고 DB 테이블에서이 종류의 정보를 저장에 있었다 :
TABLE: metadata
ID TEXT_ID TYPE OFFSET_START OFFSET_END CONTENT
1 lipsum note 68 79 this sounds really funny latin
이러한 방식으로 메타 데이터는 text_id
텍스트를 저장하는 테이블에 연결된 외래 키와 같은 고유 ID 를 가지며 간단한 문자 오프셋 범위를 사용하여 데이터를 텍스트 자체와 연결합니다 .
이것은 데이터를 메타 데이터 와 분리하여 유지하는 비결 이지만,이 방법으로 즉시 볼 수있는 문제는 텍스트를 근본적으로 편집 할 수 없다는 것 입니다. 나는 메타 데이터의 대입 한 후 텍스트의 편집을 구현하려는 경우 또는, 나는 기본적으로 이전 버전에 비해 캐릭터의 추가 또는 제거를 계산하고 있는지 여부를 확인해야 할 것이다 각 이 수정의 전 또는 후에 제거 문자를 추가하거나 각 관련 메타 데이터
나에게는 정말 우아하지 않은 접근법처럼 들립니다.
문제에 어떻게 접근 할 수 있는지에 대한 조언이나 제안이 있습니까?
편집 2 : 일부 XML 문제
이러한 데이터 및 메타 데이터 분리가 발생하기 위해 필요한 다른 사례를 추가합니다.
- 각 사용자가 실제로 다른 사용자 메타 데이터를 표시 할 가능성이 있거나없는 다른 사용자가 동일한 텍스트의 다른 메타 데이터 세트 를 가질 수있게하려고합니다 .
마크 다운 종류 (또는 HTML 또는 XML)의 솔루션은 이 시점에서 구현하기 어려울 것입니다. 이 경우 내가 생각할 수있는 유일한 해결책은 원본 텍스트의 단일 사용자 버전을 포함하고 또 다른 DB 테이블을 사용하여 원본 텍스트 테이블에 연결하는 것 FOREIGN KEY
입니다.
이것이 매우 우아한 지 확실하지 않습니다.
- XML은 계층 적 데이터 모델을 가지고 될 일이 모든 요소 내에서 의로 간주됩니다 다른 요소의 경계 아이 가장 자주 내가 찾고 데이터 모델의 경우가 아니다; XML 에서는 부모 태그를 닫기 전에 자식 요소를 닫아야하므로 요소가 겹치지 않습니다.
예:
<note content="the beginning of the famous placeholder">
로렘 입숨 슬픔 앉아<comment content="I like the sound of amet/elit">
AMET</note>
, consectetuer adipiscing ELIT</comment>
,<note content="adversative?">
SED DIAM nonummy nibh euismod tincidunt 유타 laoreet dolore 마그나 aliquam erat volutpat.<note content="funny latin">
</note>
</note>
여기에는 두 가지 다른 문제가 있습니다.
다른 요소 겹침 : 첫 번째 메모는 첫 번째 메모 내에서 시작되지만 첫 번째 메모의 끝 이후에 끝납니다 (예 : 자식이 아님).
동일한 요소 겹침 : 마지막 메모와 굵은 체 메모가 겹칩니다. 그러나 그것들은 같은 종류의 요소이기 때문에 파서는 첫 번째 클로저에서 마지막으로 열린 요소와 마지막 클로저에서 첫 번째로 열린 요소를 닫습니다.이 상황에서는 의도하지 않은 요소입니다.