Rolling Your Own Plaintext Wiki(DB内のWiki)
-
03-07-2019 - |
質問
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つには、データベースに適応できるストレージメソッドがあります。
あなたは本質的にバージョン管理を探しているだけのようです。その場合は、差分アルゴリズムを調べてください。
ここにウィキペディアの Diff ページがあります。
簡単なphp diff google検索を実行しましたが、PHPの基本的な知識しか持っていないため、まともな例として目立ったものはありませんでした。