개별 데이터 구조로 텍스트 내 메타 데이터 저장


14

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.

이것은 내가 생각할 수있는 두 가지 문제를 일으킬 것입니다.

  1. 비교적 작은 것은, 상기 구문이 상기 텍스트 상에 우연히 발생하면, 파싱을 망칠 수 있다는 것이다.
  2. 가장 중요한 것은이 메타 데이터 가 텍스트 자체 와 별도로 유지되지 않는다는 것입니다.

이 메타 데이터가 저장되는 다른 DB 테이블과 같은이 데이터를 보유하기위한 별도의 데이터 구조를 사용하여 쿼리, 통계, 정렬 등과 ​​같은 개별적인 방식으로 사용할 수 있습니다.


편집 : 답변자가 자신의 답변을 삭제 한 이후 로이 제안을 추가하는 것이 좋습니다 .이 제안은 첫 번째 개념에서 확장 된 실용적인 제안 이었기 때문 입니다. 포스터는 유사한 구문을 사용하지만,에 메타 데이터를 연결하는 제안 PRIMARY KEYmetadata데이터베이스 테이블.

다음과 같은 것 :

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>

여기에는 두 가지 다른 문제가 있습니다.

  1. 다른 요소 겹침 : 첫 번째 메모는 첫 번째 메모 내에서 시작되지만 첫 번째 메모의 끝 이후에 끝납니다 (예 : 자식이 아님).

  2. 동일한 요소 겹침 : 마지막 메모와 굵은 체 메모가 겹칩니다. 그러나 그것들은 같은 종류의 요소이기 때문에 파서는 첫 번째 클로저에서 마지막으로 열린 요소와 마지막 클로저에서 첫 번째로 열린 요소를 닫습니다.이 상황에서는 의도하지 않은 요소입니다.


3
마크 업 언어를 작성하는 것처럼 들립니다. 잘 설정된 구문 분석 시스템이있는 HTML을 사용할 수 있으며 결과 구문 분석 트리를 조작하여 텍스트를 편집 할 수 있습니다. 데이터베이스 스토리지의 경우 Oracle XMLDB 또는 Mark / Logic과 같은 NoSQL DB를 사용할 수 있습니다.
ipaul

문제는 개념적으로 실용적이지 않습니다. 나는 HTML 또는 Markdown을 사용하거나 파서와 함께 매우 간단한 마크 업 언어를 만들 있다는 것을 의미한다 . 문제는 그것들을 분리하여 유지하고 싶다는 것입니다. 컨텐츠를 최소한으로 유지하십시오. 컨텐츠 내부의 기본 서식있는 텍스트 정보 만 유지 하면되지만 다른 모든 것은 분리해야합니다.
Sunyatasattva

1
@Sunyatasattva 이러한 복잡성을 추가하면 어떤 이점이 있습니까?
Clement Herreman

@ClementHerreman 복잡성을 추가 한 것은 무엇입니까? 데이터와 메타 데이터를 별도로 유지하는 데 따른 복잡성이 증가 했습니까?
Sunyatasattva

텍스트가 실제 문서로 작성 되었습니까? 변경되거나 업데이트 될 수 있으며 여러 버전의 텍스트에서 어떤 메타 데이터를 유지 관리해야합니까? 또는 메타 데이터가 적용되는 텍스트가 완전히 정적이고 변경되지 않습니까?
Kyle Lowry

답변:


5

귀하의 솔루션을 혼합하여 사용하려고하지만 표준 : XML을 사용합니다. 이와 같은 구문이 있습니다.

Lorem ipsum dolor sit amet, consectetuer adipiscing elit,
sed diam <note content="It sound really funny in latin">nonummy nibh</note>
euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.

왜 XML인가

당신이 그것에 대해 생각하면, 그것은 전체 웹이 어떻게 구조화되어 있는지를 의미합니다 : 의미론을 담고있는 내용 (실제 텍스트) – 메타 데이터를 부르는 것 – html 태그를 통해.

이렇게하면 정말 멋진 세상이 열립니다.

  • 무료 파서
  • 콘텐츠에 메타 데이터를 추가하는 전투 테스트 방법
  • 사용 편의성 (타겟팅하는 사용자에 따라 다름)
  • XML 파서의 표준 기능이므로 메타 데이터없이 원시 텍스트를 쉽게 추출 할 수 있습니다. 콘텐츠의 색인 가능한 버전을 갖는 것이 매우 유용하므로 예를 들어 Lorem <note>ipsum</note>검색 할 때 발생합니다 lorem ips*.

XML over Markdown을 선택해야하는 이유

stackexchange와 같은 웹 사이트는 강조 표시, 링크 / URL, 이미지, 헤더 등과 같이 내용이 전달하는 의미가 다소 기본적이므로 마크 다운을 사용합니다. 내용에 추가하는 의미가

  1. 더 복잡한
  2. 변경 될 수 있거나 확장 가능해야합니다

따라서 Markdown이 실제로 좋은 아이디어는 아니라고 생각합니다. 또한 Markdown은 실제로 표준화되지 않았으며 구문 분석 / 덤프는 엉덩이에 고통을 줄 수 있습니다 .Markdown 구문 분석에서 만난 WTF에 대한 Jeff Atwood의 게시물을 참조하십시오 .

데이터와 메타 데이터를 분리 할 때

본질적으로 이러한 분리는 필수 사항이 아닙니다. 나는 그것이 당신이 가져다주는 이점을 찾고 있다고 가정합니다.

  • 메타 데이터없이 원시 컨텐츠를 보유 할 가능성
  • 우려의 분리 : 데이터로 인해 메타 데이터를 조작 할 때 부작용이나 복잡성 오버 헤드를 원하지 않습니다.

이러한 모든 문제는 XML을 사용하여 해결됩니다. XML을 사용하면 태그가 달린 내용을 쉽게 덤프 할 수 있으며 속성 / 실제 텍스트가 XML로 분리되는 것처럼 데이터 / 메타 데이터가 분리됩니다.

또한 메타 데이터가 데이터에 완전히 묶이지 않을 수 있다고 생각합니다 . 설명에서 메타 데이터는 데이터의 구성입니다. 즉 데이터를 삭제하면 메타 데이터가 삭제됩니다. 메타 데이터가 일반적인 HTML / CSS와 다른 곳입니다. CSS는 다른 요소에 적용될 수 있기 때문에 html 요소가 제거 될 때 사라지지 않습니다. 나는 이것이 당신의 메타 데이터에 있다고 생각하지 않습니다.

XML 또는 Markdown과 같이 메타 데이터를 데이터에 가까이두면 데이터를 쉽게 이해하고 디버깅 할 수 있습니다. 또한 두 번째 생각에 제시 한 예는 약간의 복잡성을 추가합니다. 읽고있는 각 데이터에 대해 메타 데이터 테이블을 쿼리하여이를 얻을 수 있기 때문입니다. 데이터와 메타 데이터의 관계가 1 : 1 또는 1 : N 인 경우 IMO는 분명히 쓸모가 없으며 복잡성 만 발생합니다 (YAGNI의 경우).


내가 찾고있는 또 다른 장점 은 메타 데이터를 독립적으로 사용할 수 있다는 것 입니다. 이는 내용에 신경 쓰지 않고 메타 데이터 만 쿼리한다는 것을 의미합니다. 1 : n의 관계 데이터 : 메타 데이터가 왜“분명히 쓸모 없다”고 생각 하는가?
Sunyatasattva

데이터 솔루션 내부의 메타 데이터를 쓸모없는 또 다른 사례를 추가해 보겠습니다 . 단일 텍스트가 다른 사용자의 메타 데이터를 가질 수있게하고 싶습니다. 다른 사용자의 메타 데이터를 볼 수도 있고 그렇지 않을 수도 있습니다. .
Sunyatasattva

나는 새로운 편집에서 이것에 대해 조금 자세히 설명했다.
Sunyatasattva

+1 이것이 바로 SGML과 XML을위한 것입니다.
로스 패터슨

문제는 내가 아는 한 XML에서 다른 요소 안에 있는 요소는 요소의 하위 요소로 간주되며 태그 겹침이 불가능하다는 것입니다 (즉, 부모를 닫기 전에 자식을 닫아야합니다) ). 필자의 경우 두 노트가 확실히 겹칠 수있는 계층 구조가 없습니다 (응답 끝에 예제가 추가됨).
Sunyatasattva

3

솔루션 사용 사례

나는 다른 해결책 중 일부에 동의하지 않습니다. 왜냐하면 훌륭한 솔루션이지만 아마도 귀하의 솔루션 이 아니기 때문 입니다. 예 XML에는 약어로 단어 마크 업이 있지만 상황에 적합하지 않을 수 있습니다. 너무 복잡하여 메타 데이터를 원본 텍스트와 분리하는 데 거의 도움이되지 않습니다. 본질적으로 모든 것을 메타 데이터 형태로 바꾸어 하나의 과체중 데이터 세트를 만듭니다.

절대적으로 올바른 해결책이나 접근 방법이 없기 때문에 최상의 해결책은 다음과 같은 질문에 대답합니다.

시스템은 데이터를 어떻게 사용합니까?

또한 솔루션 디자인이 시스템의 가치에 어떻게 사용되는지에 따라 어떻게 해낼 수 있을지에 대한 답 을 찾는다면 우아한 답변 을 찾는 데 더 가깝습니다 .

문제 이해

충분한 주석이 있습니다. 문제를 파헤쳐 봅시다. 이것이 내가 이해하는 문제입니다 (분명히 추가하면 유익 할 것입니다).

  • 원문이 있습니다
    • 이 원본에 대한 가정 :
    • 이 텍스트는 여러 개의 독립적 인 문서로 구성되거나 구성되지 않을 수 있습니다
    • 이 텍스트 는 한 명 이상의 사용자 가 편집 하거나 편집 하지 않을 수 있습니다
    • 이 텍스트에는 관련 정보 가 포함되어 있습니다 . 그것에 의해 나는 (내가 틀렸다면 나를 교정하십시오) 메타 데이터 가 관련이 있고 설명 적이 지 않다고 . 따라서 텍스트를 설명하는 정보가 아니라 원본 텍스트와 관련된 정보를 저장합니다. 원래 텍스트에 대한 메모를 저장하고, 예에 의해 텍스트가 있음을 설명하지 않습니다 그래서 입니다 제목 입니다 대담하고 있다 웹 사이트 등에 대한 링크
    • 메타 데이터와 별도로 텍스트를 쉽게 필터링해야합니다.
    • 텍스트가 손상되거나 메타 데이터가 손상되지 않도록 텍스트를 보호해야합니다.
  • 원본 텍스트 (메타 데이터)와 관련된 정보를 저장하는 수단이 있어야합니다.
    • 이 메타 데이터에는 메타 데이터에 대한 설명, 날씨, 메모 또는 날씨와 같은 메타 데이터와 관련이있는 사용자 (또는 그룹)와 같은 정보를 보유하는 자체 메타 데이터도 필요합니다. 설명 등
    • 이 메타 데이터 (및 메타 데이터)는 원본 텍스트의 변경, 메타 데이터의 변경 및 (메타) 메타 데이터의 변경을 견뎌야합니다.
    • 메타 데이터 (+ Meta-Metadata)는 잘 구성되고 쉽게 쿼리되고 색인이 생성되거나 결합되어야합니다. 다른 데이터 세트에 관계형 방식으로 . 메타 데이터의 관계 적 특성은 쿼리로 제한 될뿐만 아니라 관계형 데이터 활동의 결과로 메타 데이터의 업데이트 또는 쓰기 및 변경을 용이하게 합니다 .
    • 메타 데이터 (+ 메타 데이터)의 가치는 매우 관련성이 있습니다. 원본 텍스트와의 관계가 느슨해지면 즉시 역효과를냅니다. 그래서 원본 텍스트와의 관계 무결성 은 필수 디자인 명령입니다.
  • 문제의 성격과 사용 방법에 대한 다른 가정은 다음과 같습니다.
    • 동시 이기종 시스템 액세스. 즉, 관리자 (또는 다른 프로세스)가 구조화 된 메타 데이터에 대해 관계형 데이터 쿼리를 수행하는 것과 동시에 사용자가 텍스트를보고 메타 데이터를 편집하기를 원할 수 있습니다.
    • 이 시스템에는 여러 명의 사용자가 있습니다
    • 이 시스템은 현대적입니다. 즉, 저장 공간, 처리 속도 또는 실시간 명령에 의해 제약을받지 않습니다. 무결성 및 목적 중심 기능은 물리적 컴퓨팅 리소스 제한보다 우선 순위가 높습니다.
    • 시스템이 사용됨에 따라 시스템의 사용 및 기능이 다소 발전하거나 변경 될 수있는 가능성은 낮습니다.

솔루션 디자인 구축

위에서 설명한대로 문제를 이해하면 이제 위의 문제를 해결하기위한 가능한 해결 방법과 접근 방법을 제안 할 것입니다.

구성 요소

따라서 사용자 정의 빌드 된 사용자 액세스 시스템이 필요할 것입니다. 원본 텍스트에서 관련성 있고 관련성이없는 메타 데이터를 필터링합니다. 텍스트로 메타 데이터를 쉽게 편집하고 볼 수 있습니다. 메타 데이터와 원본 텍스트 간의 관계의 무결성을 보장합니다. 메타 데이터를 구조화하고 관계형 데이터 시스템에 데이터 소스를 제공합니다. 대부분의 다른 목적 중심 기능을 제공 할 것입니다.

구조

따라서 메타 데이터의 무결성을 원본 텍스트로 유지하는 것이 중요하므로이를 보장하는 가장 좋은 방법은 메타 데이터를 인라인 으로 유지하는 것입니다 원본 텍스트와 으로 입니다. 이렇게하면 무결성을 유지하면서 원본 데이터를 자신있게 편집 할 수 있다는 이점이 있습니다.

이 접근법의 우려는 원본 데이터에 의한 메타 데이터의 손상과 그 반대입니다. 쿼리 및 업데이트와 효율적인 액세스를 허용하는 방식으로 메타 데이터와 메타 데이터의 적절한 색인 및 구조화. 원본 텍스트에서 메타 데이터를 쉽게 필터링 할 수 있습니다.

이를 염두에두고 솔루션의 일부 는 원본 텍스트에서 ESCAPE CHARACTERS 를 사용하는 방법을 기반으로 제안 합니다. 이다 없습니다 당신의 자신의 마크 업 언어를 설계하거나 XML 또는 HTML과 같은 기존의 마크 업 언어를 사용하는 것과 같습니다. 원본 텍스트에 0 또는 거의 0의 확률이있는 ESCAPE CHARACTER 를 쉽게 디자인 할 수 있습니다.

이와 관련하여 제 조언은 원래 데이터를 신중하게 고려하고 저장된 코드 페이지의 특성을 결정한 다음 이상적인 CHARACTER 또는 CHARACTER SEQUENCE 를 찾는 것입니다.발생이 불가능하거나 불가능합니다. 예를 들어, ASCII에는 문자 그대로 표준 사용자 인터페이스에서 사용되지 않는 바이트 값을 가진 내장 제어 문자가 있습니다. 폰트 기반 또는 관계형 데이터 기반 정보 시스템에 대해서도 마찬가지이다. 이진 데이터 코덱에주의하십시오. 원래 데이터의 특성에 따라, 제어 된 시퀀스의 발견을 확인하는 구문 분석기를 빌드하는 것이 유용 할 수 있습니다. 이스케이프 된 각 데이터 시퀀스에 대해 계산 된 제어 문자를 포함하여 데이터를 생성합니다.

이스케이프 시퀀스가있는 데이터 예

이것은 남자의 이야기입니다. >>>> (#) 남자에 대한이 이야기는 왜 여자가 아닌가? (#) ( ) userid :: 77367 ( ) 관리자 의견 ( ) DataID :: 234234234 >>>> 초원을 깎기 위해 갔다. 그 남자는 개와 함께 갔다 >>>> (#) 고양이를 깎아서 고양이와 함께 이야기를하는 것이 더 좋을지 고객에게 물어보세요. 이제 이것은 초원을 깎기 위해 갔던 한 남자와 그의 개 이야기입니다.

한 남자와 그의 개는 초원을 깎고 초원을 깎고 초원이 산 위에 닿았습니다. >>>> (#) 이것은 숲과 함께 더 잘 들립니다 (**) 제안 사항 (#) >>>>

남자와 그의 개와 그의 임무는 초원을 깎고 산을 넘어 초원은 강을 건너면 도달합니다.

이스케이프 시퀀스가없는 데이터 예

이것은 남자의 이야기입니다. 초원을 깎기 위해 갔던 사람이 초원을 깎기 위해갔습니다. 남자는 초원을 깎기 위해 개와 함께 갔다. 이제 이것은 초원을 깎기 위해 갔던 한 남자와 그의 개 이야기입니다.

한 남자와 그의 개는 초원을 깎고 초원을 깎고 초원이 산 위에 닿았습니다.

남자와 그의 개와 그의 임무는 초원을 깎고 산을 넘어 초원은 강을 건너면 도달합니다.

분명히 이것은 전체 구문 분석 언어로 복잡하지 않고 쉽게 구문 분석되고 사용자의 목적에 쉽게 적응할 수 있습니다.

아직 해결 되었습니까? 글쎄, 나는 아니오라고 말할 것입니다. 우리 솔루션에는 여전히 약간의 구멍이 있습니다. 이 데이터의 인덱싱 및 구조화 된 액세스가 좋지 않습니다. 또한이 파일 (또는 여러 파일)을 편집하는 동시에 쿼리하는 것은 합리적이지 않습니다.

우리는 어떻게 그 문제를 해결할 수 있습니까?

DATA ALLOCATION TABLE 을 문서 헤더로 제안합니다 . 또한 TRANSACTIONAL TABLE UPDATE QUEUE 구현을 제안합니다 . 설명하겠습니다. 파일 시스템, 특히 회전 디스크 파일 시스템의 설계자는 위에서 설명한 것과 유사한 설계 문제에 직면했습니다. 데이터와 함께 디스크에있는 파일에 대한 정보를 포함시켜야했습니다. 이 데이터의 관계 무결성에 대한 훌륭한 솔루션 은 파일 할당 테이블복제 하는 것이 었습니다. (FAT) .

이는 각 개별 메타 데이터 항목에 대해 데이터 할당 테이블 에 해당 항목이 있음을 의미합니다 . 따라서 빠르고, 구조적이며 관계 적이며 원본 데이터와 무관합니다. 메타 데이터에 대해 쿼리, 조인 또는 업데이트를 수행해야하는 경우 간단히 데이터 할당 테이블에 액세스하여 쉽게 수행 할 수 있습니다 .

원래 인라인 메타 데이터가 데이터 할당 테이블 데이터를 실제로 반영하도록주의를 기울여야합니다 . 트랜잭션 테이블 업데이트 큐가 들어오는 곳입니다. 메타 데이터의 모든 변경, 추가 또는 제거는 자체 ​​데이터가 아니라 큐에서 이루어집니다. 그런 다음 대기열은 모든 변경 사항이 인라인 및 테이블 데이터에 적용되거나 전혀 변경되지 않도록합니다. 또한 비동기 업데이트를 수행 할 수 있습니다. 예를 들어 큐에서 delete 명령을 실행하여 특정 사용자의 모든 메타 데이터를 삭제할 수 있습니다. 인라인 메타 데이터가 잠기고 사용중인 경우, 큐는 테이블 데이터와 인라인 데이터 모두에 대해 수행 할 때까지 변경을 수행하지 않습니다.


1
안녕 스티븐과 프로그래머에 오신 것을 환영합니다! 귀하의 답변에 대한 열정에 감사 드리지만 관련 해설을 제거해야했습니다. 우리는 답변이 더 간결하고 정확하며 가능한 한 많은 사람들이 더 접근하기 쉽도록 선호합니다.
yannis

우선, 나는 대답의 열정을 좋아한다고 말해야합니다. 좋은 피드백을 듣는 것이 좋았습니다. 답변 자체에 관해서는 태그를 열고 닫는 동일한 구문에 위배된다고 말해야합니다. 그리고 아마도 가장 최근의 업데이트에서 위에서 설명한 XML 문제를 피하기 위해 태그 자체에서 무엇을 열고 닫을지를 지정합니다. 아마도 그렇게 : >>>>>(#1) Lorem ipsum (#1)>>>>>>. 또한 텍스트 주석에서 접근하면 특정 고정 위치에 바인딩되는 것처럼 보입니다. 오프셋을 이동하면 어떻게 작동합니까?
Sunyatasattva

또한 정확한 점이 아닌 오프셋 범위에 주석을 바인딩하는 사실에 어떻게 접근하고 접근 합니까? 마지막으로, 데이터 할당 테이블과 트랜잭션 업데이트 큐는 놀라운 개념으로 보입니다. 주제에 대해 조사했지만이 아키텍처 문제에서 이러한 개념을 어떻게 구현하고 구현할 것인지 조금 더 자세히 설명해 주시겠습니까?
Sunyatasattva

1

이것은 모든 옵션에 다른 상충 관계가 있으며 가장 중요한 것은 당신에게 중요한 것에 달려 있다는 점에서 일반적인 엔지니어링 질문입니다. 불행히도, 결정을 내리기에 충분한 정보를 제공하지 않았습니다.

또한 중요한 의미 론적 문제를 고려하지 않은 것 같습니다. 원문은

내 친구 밥이 5 달러 빌려줬 어

누군가가 "밥"에 대한 의견을 추가

밥은 완전한 바보

그런 다음 원본 텍스트가

제인은 밥에게 5 달러를 빌려 주었고 나중에 나에게 빌려 주었다

당신은 할 수 이러한 DIFF 파일을 표시하는 데 사용됩니다 무엇과 같은 텍스트 매칭 알고리즘을 사용하여이 특별한 경우 일부 이해하지만, 문자 오프셋 (offset)는 메타 데이터 "제인"의 "월"에 연결할 수 있도록 할 것입니다.

텍스트를 다음과 같이 편집하면 더 나쁩니다.

내 친구 스티브가 5 달러를 빌려줬어요

메타 데이터를 "Steve"에 첨부하는 방법을 알아낼 수는 있지만 적용 여부를 어떻게 알 수 있습니까?

또한 메타 데이터 자체에 메타 데이터가있을 수 있는지 결정 했습니까? 구현이 변경 될 수 있습니다.

시맨틱 문제 외에도 데이터로 무엇을하고 있는지 명확하지 않습니다. 마크 업으로 원본 텍스트를 "오염"시키는 것이 매우 불편하다고 생각했지만 ID 값이 있으면 괜찮습니다. 메타 데이터 가 텍스트의 한 지점에 삽입되는 대신 텍스트 섹션 에 적용되는 경우에는 의미가 없습니다 .

내 생각에 대부분의 경우 마크 업 된 텍스트를 저장하는 것이 더 쉬우거나 두 번째 선택으로 모든 SQL로 이동하고 텍스트와 마크 업을 노드 계층 구조 (기본적으로 테이블 형식의 DOM)로 표시하는 것이 좋습니다. 데이터가 계층 구조 인 경우 XML을 사용하고 기존 파서를 무료로 작성하는 것보다 직접 작성하는 것이 더 쉬울 수 있습니다.

정확한 상황에 맞는 상당히 간단한 해결책이있을 수는 있지만 실제로 무엇을하려고하는지에 따라 세부적으로 설명하기 때문에 그게 무엇인지 말할 수 없습니다.

많은 SQL 쿼리에 구현의 많은 부분을 표시 해야하는 경우 수행하기가 어렵지만 원하는 전략을 최대한 많이 캡슐화하는 것이 좋습니다.

답이 너무 흩어져서 "의존적"으로 가득 차서 죄송하지만, 실제 디자인 질문은 그와 같습니다.


이해하고 있으며 정확하고 정확한 답변을 찾고 있지 않습니다. 그러나 구현 아이디어, 장단점 분석 또는 아마도 다른 사람들보다 더 나은 대답이 있다고 생각했는데 생각 하지 않았습니다. 당신이 제기하는 질문에 대답하기 위해 : 아니오, 제 경우에는 메타 데이터 자체에는 메타 데이터가 없습니다.
Sunyatasattva

무엇 보다 것은 당신이해야 할 노력에 따라 달라집니다.
psr

명확한 질문을하기 위해 내 질문에 빠진 다른 세부 사항은 무엇입니까?
Sunyatasattva

합리적으로 설명 할 수있는 것 이상. 텍스트 섹션과 삽입 지점에 대한 메타 데이터를 보유하는 것이 얼마나 중요합니까, DB의 한 필드에 텍스트를 함께 유지하는 것이 얼마나 중요한지, 각 편집 빈도는 얼마나되는지, SQL을 직접 쿼리하는 것보다 쿼리가 얼마나 많이 분석되는지는 텍스트를 나중에 분석하고 각각에 대한 편안함 수준,이 단계에서 발생하는 규모, 시간이 지남에 따라 변경 될 가능성, 마크 업을 사용하는 경우 자신 만의 간단한 구문 분석기를 작성하는 것이 편한지 또는 XML을 사용하여 더 잘할 것입니까? 덜 사용자 정의하지만 더 많은 도구가 있습니다 ...
psr

그렇기 때문에 지침 만 제공 할 수 있습니다. 특히 대답은 당신뿐만 아니라 비슷한 상황에서 다른 사람들을 도울 수 있기 때문입니다.
psr

0

나는 이전 답변자로부터의 제안, 당신이 질문에 언급 한 것)이 매우 좋은 것이라고 생각합니다.

StackExchange 사이트에 링크를 게시하는 것과 같은 방식으로 작동하지만 정보 데이터는 다른 테이블에 있습니다. 장점은 데이터가 분리되어 쿼리 가능하고 인덱스 가능하다는 것입니다. 텍스트를 편집 할 때 삭제 된 메타 데이터 ID를 확인하고 메타 데이터 테이블을 정리할 수 있습니다.

당신이 말한 것처럼 작은 문제는 파싱이지만, 당신은 그것을 쉽게 처리 할 수 ​​있습니다.


어떤 이전 답변? 제시된 답변의 순서는 어떤 순서로든 보장되지 않습니다. 또는 그 문제에 대한 답변이 크게 변경되거나 삭제되어 귀하의 답변이 덜 유용 할 수 있습니다. 다른 답변을 참조 할 필요가 없도록 질문을 수정할 수 있습니까?

내 말은, 문제의 OP에 의해 이전 답변 언급
RMalke

0

텍스트가 있다고 가정 해 보겠습니다.

Lorem ipsum dolor 앉은 자세, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore 마그나 aliquam erat volutpat.

다음과 같이 메모를 추가합니다.

Lorem ipsum의 dolor 앉은 자리, consectetuer adipiscing elit, sed diam [@ 123, # 456,2w] nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.

[@123,#456,2w]의미 : user_id = 123, note_id = 456,이 메모로 표시된 텍스트는 다음 두 단어에 해당합니다 (문자 ( c), 문장 ( s), 패러 그래프 ( p) 등). 정확한 구문은 물론 다를 수 있습니다.

일반 텍스트 편집기에서는 마크 다운 각주와 마찬가지로 메모 텍스트를 문서 끝에 쉽게 저장할 수 있습니다.

서식있는 텍스트 편집기에서 이러한 종류의 노트는 텍스트에 아이콘으로 표시 될 수 있으며 표시된 텍스트는 어떤 방식 으로든 강조 표시 될 수 있습니다. 사용자는 단지 정상과 문자 등의 메모를 삭제 Del하거나 Backspace, 특수 편집 모드의 어떤 종류의 편집을. 마우스로 메모 영역의 크기를 조정하고 팝업 창으로 메모 텍스트를 편집하는 것을 상상합니다.

장점 :

  • 오프셋 (텍스트에서 메모의 위치에 따라 암시 적으로)과 각 메모의 길이를 표시하기 때문에 "교차"와 잘 어울립니다.
  • 다중 사용자 환경을 지원합니다. (실제로, 여기에는 좀 더 심층적 인 연구가 필요 하며 내 두뇌가 처리 할 수없는 Google Wave 운영 변환 과 같은 문제를 처리해야 할 것입니다 .)
  • 서식있는 텍스트 편집기와 일반 텍스트 편집기로 모두 편집 할 수 있습니다.
  • 모든 마커가 제자리에 있기 때문에 개정을 쉽게 처리 할 수 ​​있습니다. 마커 앞의 텍스트를 편집하면 마커가 다른 텍스트와 함께 이동합니다.
  • 파싱하기 쉽습니다.
  • 외부 DB가 필요하지 않지만 원하는 경우 계속 사용할 수 있습니다.
  • 눈에 잘 띄지 않는 구문을 선택하면 Markdown 또는 XML과 혼합 될 수 있습니다.

일반 텍스트 편집의 단점 :

  • 옵션으로 일반 텍스트를 강조 표시하지 않는 한 메모로 표시된 텍스트 영역을 볼 수없고 메모가 시작되는 위치 만 볼 수 있습니다. 이것은 문자, 단어, 문장, 단락 등 임의의 길이 단위를 선택할 수있는 기능으로 보완됩니다.
  • 특히 메모가 꽤 긴 경우 (예 : 2+ 단락) 메모없이 텍스트 아래에서 텍스트를 편집 할 수 있습니다. 각 메모 아래의 텍스트를 이전 버전과 비교하고 변경된 경우 사용자에게 알리는 수정 제어 메커니즘으로 보완 할 수 있습니다.

일반적인 단점 :

  • 여러 사용자가 동일한 텍스트를 편집하는 데 문제가 있지만 어쨌든 피할 수 없다고 생각합니다. 저는이 분야의 전문가가 아닙니다.

귀하의 의견으로는 클로저 태그를 추가하지 않고 오프셋을 사용하는 전문가는 무엇입니까? 너무 위험하지 않습니까? nonummy과 사이에 단어를 추가하면 nibh오프셋이 엉망이되지 않습니까?
Sunyatasattva

그렇습니다. 오프셋이 엉망이 될 수 있으며이 문제는 "가상"메모 끝 마커가있는 서식있는 텍스트 편집기에서 해결할 수 있습니다.이 마커는 명시 적으로 편집 할 수없는 경우를 제외하고는 시작 마커와 동일하게 작동합니다. 노트 끝, 편집 된 텍스트와 함께 이동) 및 텍스트와 함께 저장되지 않습니다. 편집하는 동안 삽입 한 다음 저장할 때 삭제하면됩니다. 일반적으로 시작 마커와 끝 마커에 더 많은 문제가있을 수 있지만 그중 하나만 사용하면 문제가 발생할 수 있지만 물론 잘못되었을 수 있습니다.
scriptin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.