2009-03-04 29 views
6

Bất cứ ai biết về một API (thích hợp hơn nhưng tôi muốn quan tâm đến bất kỳ ngôn ngữ nào) để tạo lưu trữ dữ liệu giống như wiki?Vạch bản tóm tắt của riêng bạn Wiki (Wiki bên trong một DB)

Làm thế nào về bất kỳ tài nguyên nào trên trang wiki của riêng bạn? Làm thế nào để các tập tin văn bản khác xử lý định dạng của tệp văn bản?

Tôi hiểu rằng tôi có thể sử dụng Markdown hoặc Textile để định dạng. Nhưng điều tôi quan tâm nhất là làm cách nào để tiếp cận lưu trữ bản gốc của các chỉnh sửa đa người dùng.

Tôi đang viết ứng dụng web chủ yếu dựa trên cơ sở dữ liệu. Tôi muốn ít nhất một trường văn bản của cơ sở dữ liệu này có định dạng giống như wiki. Cụ thể, văn bản này có thể được nhiều người dùng chỉnh sửa với khả năng quay lại bất kỳ phiên bản nào. Hãy suy nghĩ phần wiki/sinh học của Last.FM (gần như toàn bộ trang web được cấu trúc chặt chẽ bởi một cơ sở dữ liệu ngoại trừ phần này cho mỗi nghệ sĩ).

Cho đến nay, cách tiếp cận tách rời MediaWiki của tôi và chèn nó vào cơ sở dữ liệu có vẻ như quá mức cần thiết. Tôi nghĩ sẽ dễ dàng hơn khi cuộn trang wiki thô của riêng tôi và lưu trữ tệp này trong trường văn bản thích hợp của cơ sở dữ liệu.

+0

Bạn có thể thêm bảng mới vào cơ sở dữ liệu hoặc một cái gì đó? Tôi không theo dõi lý do tại sao bạn muốn tạo một wiki "văn bản" bên trong cơ sở dữ liệu. Có lẽ tôi chỉ không hiểu thuật ngữ của bạn. –

+0

Tôi muốn tương đương với một trang wiki được lưu trữ trong một trường văn bản trong cơ sở dữ liệu của tôi – ack

+0

không rõ câu trả lời cho câu hỏi của bạn là "MySql có một kiểu dữ liệu văn bản cho các nội dung lớn" hoặc nếu bạn đang yêu cầu một cái gì đó phức tạp hơn về phiên bản vv –

Trả lời

15

Vì vậy, về cơ bản đây là "thông tin văn bản phiên bản của tôi trong DB của tôi".

Vâng, cách đơn giản nhất là sao chép dữ liệu đơn giản.

Chỉ cần tạo bảng "phiên bản" chứa "phiên bản cũ" của dữ liệu và liên kết lại với bảng chính của bạn.

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 
} 

Bất cứ khi nào bạn cập nhật tài liệu gốc, bạn sao chép giá trị văn bản cũ vào bảng này, sao chép người dùng và thay đổi ngày và làm theo phiên bản.

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; 

Bạn thậm chí có thể thực hiện việc này nếu kích hoạt DB của bạn.

Lỗi với phương pháp này là bản sao đầy đủ của dữ liệu (vì vậy nếu bạn có tài liệu lớn, phiên bản vẫn ở mức lớn). Bạn có thể giảm thiểu điều đó bằng cách sử dụng một cái gì đó như diff (1) và patch (1).

Ví dụ:

diff version2.txt version1.txt > difffile 

Sau đó, bạn có thể lưu trữ difffile đó là "phiên bản 1".

Để khôi phục phiên bản 1 từ phiên bản 2, bạn lấy dữ liệu phiên bản 2, chạy bản vá trên dữ liệu tệp khác và cung cấp cho bạn v1.

Nếu bạn muốn chuyển từ v3 sang v1, bạn cần thực hiện thao tác này hai lần (một lần để nhận v2 và sau đó lại nhận được v1).

Điều này làm giảm gánh nặng lưu trữ của bạn, nhưng tăng cường xử lý của bạn (rõ ràng), vì vậy bạn sẽ phải đánh giá cách bạn muốn làm điều này.

+0

cách tiếp cận tốt đẹp, tôi sẽ xem xét điều này! – ack

+0

Tuyệt vời đơn giản và hiệu quả so với mediawiki http://upload.wikimedia.org/wikipedia/commons/4/41/Mediawiki-database-schema.png – Cherian

+0

btw y do u cần date change_date và change_user_id tham chiếu số nguyên người dùng (id) trong bảng tài liệu? không thể được suy ra từ bảng phiên bản? – Cherian

0

Đây là danh sách tất cả 12 wiki trên WikiMatrix được viết bằng PHP và lưu trữ chúng bằng cách sử dụng tệp văn bản. Có lẽ một trong số họ sẽ có một phương pháp lưu trữ mà bạn có thể thích ứng vào cơ sở dữ liệu:

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

0

Nghe có vẻ như bạn là chủ yếu chỉ tìm kiếm kiểm soát phiên bản. Nếu đúng như vậy, bạn có thể muốn xem xét một thuật toán khác.

Đây là trang Wikipedia Diff.

Tôi đã thực hiện tìm kiếm nhanh khác biệt trên google, nhưng không có gì thực sự nổi bật như một ví dụ tốt, vì tôi chỉ có kiến ​​thức cơ bản về PHP.

2

Câu trả lời rất lớn của tôi là đúng, nhưng có thể tóm tắt, tôi nghĩ: bạn cần phải lưu trữ các phiên bản, và sau đó bạn cần lưu trữ siêu dữ liệu (những gì khi dữ liệu).

Nhưng câu hỏi của bạn là về tài nguyên trên phiên bản giống như Wiki. Tôi không có (tốt, một: Will's answer above). Tuy nhiên, về việc lưu trữ của Wikis, tôi có một. Kiểm tra the comparison matrix from DokuWiki. Tôi biết. Bạn đang suy nghĩ "Tôi quan tâm đến những gì thương hiệu của DB khác nhau mà Wikis sử dụng?" Bởi vì DokuWiki sử dụng các tệp văn bản thuần túy. Bạn có thể mở chúng và chúng thực sự đơn giản. Vì vậy, đó là một cách tiếp cận, và họ đã có một số đối số thú vị là tại sao DBMS không phải là cách tốt nhất để đi. Họ thậm chí không nắm giữ nhiều siêu dữ liệu: hầu hết các công cụ được thực hiện thông qua các tệp phẳng.

Điểm của DokuWiki cho bạn biết là có thể nó là một vấn đề tương đối đơn giản (tùy thuộc vào như thế nào bạn muốn giải quyết nó :)

Các vấn đề liên quan