문제

Wiki와 같은 데이터 저장소를 만들기 위해 API (PHP가 바람직하지만 어떤 언어에도 관심이있을 것인지)를 아는 사람이 있습니까?

자신의 일반 텍스트 위키를 굴리는 리소스는 어떻습니까? 다른 일반 텍스트 위키는 텍스트 파일의 형식을 어떻게 처리합니까?

서식에 Markdown 또는 Textile을 사용할 수 있다는 것을 이해합니다. 그러나 내가 가장 관심이있는 것은 멀티 사용자 편집의 일반 텍스트 저장에 접근하는 방법입니다.

주로 데이터베이스 중심의 웹 응용 프로그램을 작성하고 있습니다. 이 데이터베이스의 적어도 하나의 텍스트 필드가 Wiki와 같은 형식이되기를 원합니다. 특히,이 텍스트는 모든 버전으로 롤백 할 수있는 여러 사용자가 편집 할 수 있습니다. 위키/바이오 섹션을 생각해보십시오 마지막 .fm (거의 전체 사이트는 아티스트 당 하나의 섹션을 제외하고 데이터베이스에 의해 엄격하게 구성됩니다).

지금까지 MediaWiki를 분리하고 데이터베이스에 쌓는 것에 대한 나의 접근 방식은 과잉처럼 보입니다. 나는 내 자신의 일반 텍스트 위키를 롤링 하고이 파일을 데이터베이스의 적절한 텍스트 필드에 저장하는 것이 훨씬 쉽다고 생각합니다.

도움이 되었습니까?

해결책

따라서 기본적으로 이것은 "내 DB의 텍스트 정보를 어떻게해야합니까?"입니다.

글쎄, 가장 간단한 방법은 단순히 데이터를 복사하는 것입니다.

간단히 말해서, 데이터의 "이전 버전"을 보유한 "버전"테이블을 만들고 메인 테이블에 다시 연결하십시오.

create table docs {
    id integer primary key not null,
    version integer not null,
    create_date date,
    change_date date,
    create_user_id integer not null references users(id),
    change_user_id integer references users(id),
    text_data text
}

create table versions {
    id integer primary key not null,
    doc_id integer not null references docs(id),
    version integer,
    change_date date,
    change_user integer not null references users(id),
    text_data text
}

원본 문서를 업데이트 할 때마다 이전 텍스트 값을이 테이블에 복사하고 사용자를 복사하고 날짜를 변경하고 버전을 부딪칩니다.

select version, change_date, change_user, text_data 
    into l_version, l_change_data, l_change_user, l_text_data 
from docs where id = l_doc_id;

insert into versions values (newid, l_doc_id, l_version, 
    l_change_date, l_change_user, l_text_data);

update docs set version = version + 1, change_date = now, 
    change_user = cur_user, text_data = l_new_text where id = l_doc_id;

DB가 지원하는 경우 트리거 에서이 작업을 수행 할 수도 있습니다.

이 방법의 결함은 데이터의 전체 사본이라는 것입니다 (따라서 큰 문서가있는 경우 버전은 크게 유지됨). diff (1) 및 패치 (1)와 같은 것을 사용하여이를 완화 할 수 있습니다.

예를 들어:

diff version2.txt version1.txt > difffile

그런 다음 해당 Difffile을 "버전 1"으로 저장할 수 있습니다.

버전 2에서 버전 1을 복구하려면 Diff 파일 데이터를 사용하여 버전 2 데이터를 가져 와서 패치를 실행하면 v1을 제공합니다.

v3에서 v1로 가려면이 작업을 두 번 수행해야합니다 (V2를 얻으려면 다시 V1을 얻으려면).

이렇게하면 스토리지 부담이 줄어들지 만 처리가 증가 하므로이 작업을 수행하는 방법을 판단해야합니다.

다른 팁

Will의 큰 대답은 옳지 않지만 요약 할 수 있습니다. 버전을 저장해야하며 메타 데이터를 저장해야합니다 (데이터의 시점).

그러나 귀하의 질문은 Wiki와 같은 버전싱에 관한 자원에 관한 것이 었습니다. 나는 없다 (음, 하나 : 위의 윌의 대답). 그러나 Wikis의 저장에 대해서는 하나가 있습니다. 체크 아웃 Dokuwiki의 비교 매트릭스. 알아요. 당신은 "어떤 브랜드의 다른 Wikis가 어떤 브랜드를 사용 하는가?"라고 생각하고 있습니다. Dokuwiki는 일반 텍스트 파일을 사용하기 때문입니다. 당신은 그들을 열 수 있고 그들은 실제로 평범합니다. 그래서 그것은 하나의 접근법이며, 왜 DBM이 가장 좋은 방법이 아닌지에 대한 흥미로운 주장이 있습니다. 그들은 메타 데이터를 많이 가지고 있지 않습니다. 대부분의 물건은 플랫 파일 자체를 통해 이루어집니다.

Dokuwiki의 요점은 아마도 비교적 간단한 문제라는 것입니다 (당신이 그것을 얼마나 잘 해결하고 싶은지에 따라 :)

Wikimatrix의 12 개의 Wikis 목록은 PHP로 작성되어 텍스트 파일을 사용하여 스토리지를 수행합니다. 아마도 그중 하나는 데이터베이스에 적응할 수있는 스토리지 방법을 가질 것입니다.

http://www.wikimatrix.org/search.php?sid=1760

본질적으로 버전 제어를 찾고있는 것 같습니다. 이 경우 Diff 알고리즘을 조사하고 싶을 수도 있습니다.

여기 위키 백과가 있습니다 차이 페이지.

나는 빠른 PHP Diff Google 검색을 수행했지만 기본적인 PHP 지식 만 가지고 있기 때문에 괜찮은 예는 없었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top