6

Wiki のようなデータ ストレージを作成するための API (php が望ましいですが、どの言語にも興味があります) を知っている人はいますか?

独自のプレーンテキスト wiki を作成するためのリソースはありますか? 他のプレーンテキスト ウィキはテキスト ファイルの形式をどのように処理しますか?

書式設定に Markdown または Textile を使用できることを理解しています。しかし、私が最も興味を持っているのは、マルチユーザー編集のプレーンテキスト ストレージにアプローチする方法です。

主にデータベース駆動型の Web アプリケーションを作成しています。このデータベースの少なくとも 1 つのテキスト フィールドを wiki のような形式にする必要があります。具体的には、このテキストは複数のユーザーが編集でき、任意のバージョンにロールバックできます。Last.FMの wiki/bio セクションを考えてみてください(アーティストごとに 1 つのセクションを除いて、サイトのほぼ全体がデータベースによって厳密に構造化されています)。

これまでのところ、MediaWiki を分解してデータベースに組み込むという私のアプローチは、やり過ぎのように思えます。独自のプレーンテキスト wiki を作成し、このファイルをデータベースの適切なテキスト フィールドに保存する方がはるかに簡単だと思います。

4

4 に答える 4

15

つまり、基本的にこれは「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) や patch(1) などを使用して軽減できます。

例えば:

diff version2.txt version1.txt > difffile

次に、その difffile を「バージョン 1」として保存できます。

バージョン 2 からバージョン 1 を復元するには、バージョン 2 のデータを取得し、差分ファイルのデータを使用してパッチを実行すると、v1 が得られます。

v3 から v1 に移行する場合は、これを 2 回行う必要があります (v2 を取得するために 1 回、v1 を取得するために 1 回)。

これにより、ストレージの負担が軽減されますが、(明らかに) 処理が増えるため、これをどのように行うかを判断する必要があります。

于 2009-03-05T00:41:35.963 に答える
2

ウィルの大きな答えは正しいですが、要約すると、バージョンを保存する必要があり、次にメタデータを保存する必要があると思います(誰がいつデータを保存したか)。

しかし、あなたの質問は Wiki のようなバージョン管理に関するリソースに関するものでした。私は何も持っていません(まあ、1つ:上記のウィルの答え)。ただし、Wiki の保管については、私は 1 つ持っています。DokuWiki の比較表を確認してください。知っている。あなたは、「さまざまな Wiki がどのブランドの DB を使用しているのか、どうすればよいのか?」と考えています。DokuWiki はプレーン テキスト ファイルを使用するためです。あなたはそれらを開くことができ、それらは確かに単純です. これは 1 つのアプローチであり、なぜ DBMS が最善の方法ではないのかについて興味深い議論をしています。それらは多くのメタデータを保持することすらありません。ほとんどのことはフラット ファイル自体を通じて行われます。

あなたにとっての DokuWiki の要点は、おそらくそれが比較的単純な問題であるということです (どれだけうまく解決したいかによって異なります :)

于 2009-03-05T01:04:49.903 に答える
0

これは、PHPで記述され、テキストファイルを使用してストレージを実行するWikiMatrix上の12のWikiすべてのリストです。おそらく、そのうちの1つには、データベースに適応できるストレージ方法があります。

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

于 2009-03-05T00:12:05.723 に答える
0

基本的にバージョン管理を探しているだけのようです。その場合は、差分アルゴリズムを調べてください。

これがウィキペディアの差分ページです。

私は簡単な php diff google 検索を行いましたが、基本的な PHP の知識しか持っていないため、まともな例として目立ったものは何もありませんでした。

于 2009-03-05T00:38:36.360 に答える