(DB içinde Wiki) Kendi Plaintext Wiki Rolling

4 Cevap php

Herkes bir API bilmek (tercih php ama herhangi bir dilde ilgi duyarım) wiki benzeri veri depolama oluşturmak için?

Nasıl kendi şifresiz wiki yuvarlanan herhangi kaynakları hakkında? Nasıl diğer düz metin Küresel metin dosyası formatını ele?

Ben biçimlendirme için Markdown veya Tekstil kullanabilirsiniz anlıyorum. Ama ben en çok ilgileniyorum, çok kullanıcılı düzenlemeler düz metin depolama yaklaşım nasıl.

Ben öncelikle veritabanı tabanlı bir web uygulaması yazıyorum. Ben bu veritabanı en az bir metin alanı wiki benzeri formatta olmak istiyorum. Özellikle, bu metin herhangi bir sürümüne geri rulo yeteneği ile birden fazla kullanıcı tarafından düzenlenebilir. Last.FM (hemen hemen tüm site kesinlikle sanatçı başına bu bir bölümü dışında bir veritabanı tarafından yapılandırılmıştır) wiki / bio bölümünü düşünüyorum.

Şimdiye kadar, MediaWiki'yi ayrı alma ve bir veritabanı içine kama benim yaklaşım overkill gibi görünüyor. Bu benim kendi şifresiz wiki rulo çok daha kolay olacak ve veritabanının uygun metin alanında bu dosyayı depolamak düşünüyorum.

4 Cevap

Yani, temelde bu bir "nasıl benim DB ben sürüm metin bilgilerini yapmak" dir.

Peki, basit yolu sadece verileri kopyalıyor.

Basitçe, verilerin "eski sürümleri" tutan bir "sürüm" tablo oluşturmak ve ana tabloya geri bağlantı.

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
}

Orijinal belge güncelleme zaman, sen bu tabloya eski metin değerini kopyalayıp kullanıcı ve değişiklik tarihi kopyalayıp sürümünü yumru.

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 bu destekliyorsa, hatta bir tetikleyici bu yapabilirdi.

Bu yöntemle arızalar veri onun tam bir kopyasını (Büyük bir belgeyi var eğer öyleyse, sürüm büyük kal) vardır. Sen fark gibi bir şey (1) ve yama (1) kullanarak bu azaltabilir.

Örneğin:

diff version2.txt version1.txt > difffile

Sonra "sürüm 1" gibi difffile saklayabilirsiniz.

Sürüm 2 sürüm 1 kurtarmak için, siz sürüm fark dosya verilerini kullanarak üzerinde yama çalıştırmak 2 verileri, yakala, ve size v1 verir.

Eğer v3 den v1 gitmek istiyorsanız, (bir kez v1 almak için sonra tekrar v2 almak, ve) iki kez yapmak gerekiyor.

Bu depolama yükünü düşürür, ama (tabii ki) sizin işleme artar, bu yüzden bunu yapmak istiyorum nasıl yargılamak gerekir.

Will'in dev cevap hakkı olduğunu, ancak özetlenebilir olabilir, ben düşünüyorum: Eğer sürümleri saklamak gerekir, ve sonra meta verileri saklamak için gereken (kim ne veri).

Ama eğer soru Wiki gibi sürüm üzerindeki kaynaklar hakkında oldu. Ben hiçbiri var (iyi, bir: Will's answer above). Ancak, Wiki ve depolama hakkında, ben bir tane var. Çıkış the comparison matrix from DokuWiki. Biliyorum. Siz "Ben farklı Wiki kullanmak DB ne marka ne umurunda?" Düşünüyorsun DokuWiki düz metin dosyaları kullanır çünkü. Sen bunları açabilir ve onlar düz gerçekten vardır. Böylece bir yaklaşım, ve onlar DBMS gitmek için en iyi yol değildir neden olarak bazı ilginç argümanlar var. Onlar bile çok meta tutmayın: şeyler çoğu düz dosyalar kendileri aracılığıyla yapılır.

Sizin için Dokuwiki noktası belki bunu çözmek istiyorum ne kadar iyi bağlı (nispeten basit bir sorun olduğunu :)

Burada PHP ile yazılmış ve metin dosyaları kullanarak depolama yapacağız WikiMatrix tüm 12 wiki bir listesi. Belki bunlardan biri size veritabanına adapte olabilen bir depolama yöntemi olacak:

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

Aslında sadece sürüm kontrolü arıyor gibi geliyor. Bu durumda ise, bir fark algoritma içine bakmak isteyebilirsiniz.

İşte Wikipedia Diff sayfası.

Ben hızlı bir php fark google araması yaptım, ama ben sadece temel PHP bilgisine sahip beri hiçbir şey gerçekten iyi bir örnek olarak göze çarpıyordu.