質問

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

独自の平文wikiを作成するためのリソースについてはどうですか?他のプレーンテキストwikiはテキストファイルの形式をどのように処理しますか?

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

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

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

役に立ちましたか?

解決

つまり、基本的にこれは「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を取得するために再度)。

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

他のヒント

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

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

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

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

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

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

ここにウィキペディアの Diff ページがあります。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top