Статьи

CouchDb: персистентность, ориентированная на документы

Если вы ищете что-то «интересное», чтобы возиться с ним, проект CouchDb Дэмиена Каца находится на стадии разработки прототипа , сервера, реализованного на Erlang ( горячая тема в некоторых местах) и демонстрационного клиентского приложения (простой форум). в PHP.

Запустить сервер CouchDb в Windows очень просто — следуйте инструкциям README. В PHP вам нужно новое расширение http, которое проще всего сделать в Win32, взяв последнюю версию PHP 5 (5.1.6) и соответствующую коллекцию модулей PECL. В качестве альтернативы последний XAMPP (по-видимому) упаковывает расширение.

Интерфейс между CouchDb и PHP — REST — XML ​​+ HTTP — вы также можете направить свой браузер непосредственно на сервер CouchDb (по умолчанию — localhost: 8080) и обойтись с небольшой помощью из вики CouchDb .

Что такое CouchDb и почему CouchDb интересен, учитывая реляционные БД и т.д.? В какой-то степени это трудно определить — лучшая отправная точка — это, вероятно, обсуждение Дэмиеном документально-ориентированной разработки . Здесь есть краткий обзор, но все же трудно найти аргумент, действительно продаваемый . Как насчет кода вместо этого? Вот фрагмент из демонстрационного приложения ( couchthread2.php ), которое обрабатывает сообщение формы;

if ($_SERVER['REQUEST_METHOD'] == 'POST') { // someone is creating a new response // Set a field named Type to "response". This is a simple // way to identify the "Type" of the document. (but we could // have as easily used Form, Class, Category etc as a field // name) $_POST['Type'] = "response"; // Add a creation date, and use a format that will sort correctly as text $_POST['CreationDate'] = date(DATE_ATOM); // add the threadid from query arg $_POST['threadid'] = $_GET['threadid']; // just take all the posted fields and save them as a new document if (couch_create_doc('http://localhost:8888/couchtest/', $_POST)) { header('Location: ' . $_SERVER['REQUEST_URI']); // reload the page exit; } }
if ($_SERVER['REQUEST_METHOD'] == 'POST') { // someone is creating a new response // Set a field named Type to "response". This is a simple // way to identify the "Type" of the document. (but we could // have as easily used Form, Class, Category etc as a field // name) $_POST['Type'] = "response"; // Add a creation date, and use a format that will sort correctly as text $_POST['CreationDate'] = date(DATE_ATOM); // add the threadid from query arg $_POST['threadid'] = $_GET['threadid']; // just take all the posted fields and save them as a new document if (couch_create_doc('http://localhost:8888/couchtest/', $_POST)) { header('Location: ' . $_SERVER['REQUEST_URI']); // reload the page exit; } } 

Давайте просто увеличим масштаб этой последней части …

if (couch_create_doc('http://localhost:8888/couchtest/', $_POST)) { header('Location: ' . $_SERVER['REQUEST_URI']); // reload the page exit; }
if (couch_create_doc('http://localhost:8888/couchtest/', $_POST)) { header('Location: ' . $_SERVER['REQUEST_URI']); // reload the page exit; } 

… просто передайте $_POST (по крайней мере, для этого простого примера). Заинтересоваться еще? А как насчет обратного прокси между PHP и db (s), который делает балансировку нагрузки прозрачной?

Из того, что я видел в Dokuwiki , где вики-страницы хранятся непосредственно, как есть, в файловой системе, можно многое сказать о сохранении «сырых ресурсов» в форме, которая облегчает их идентификацию. Обработка времени последней модификации (кэширование), репликация / зеркалирование, администрирование и целый ряд других вещей становится намного проще для управления, по сравнению с реляционной базой данных, где то, что составляет полный «документ», может быть распределено по нескольким таблицам. Конечно, недостатком таких вещей, как поиск, сортировка и отношения, становится все труднее — введите CouchDb, где (если я правильно понял) вы можете «скомпилировать» таблицы из содержимого ваших необработанных документов, используя язык фабричных формул . Если предположить, что обработка, созданная для создания таблиц, является воспроизводимой, то репликация баз данных по всем системам будет тогда «только» вопросом копирования необработанных документов.

Другой стороной этого является то, что позволяет Erlang — разработанный для телефонных коммутаторов и функционального языка программирования, означает отсутствие белок . Полезно прочитать, чтобы помочь вещам, которые нужно щелкнуть, это Функциональное программирование для всех нас

Функциональная программа готова к параллелизму без каких-либо дальнейших изменений. Вам никогда не придется беспокоиться о взаимоблокировках и условиях гонки, потому что вам не нужно использовать замки! Никакая часть данных в функциональной программе не модифицируется дважды одним и тем же потоком, не говоря уже о двух разных потоках. Это означает, что вы можете легко добавлять потоки, даже не задумываясь об обычных проблемах, которые мешают работе параллельных приложений!

… И такие вещи, как транзакции (по-видимому), становятся проще с функциональным программированием — нет неловкого состояния, возникающего после отката.

Во всяком случае — один, чтобы посмотреть, я думаю.