Files
HereConnect-obsidian/База данных.md

11 KiB

База данных проекта

Проект использует базу данных CouchDB для хранения информации о пользователях, QR-кодах и сообщениях, что позволяет организовать взаимодействие между владельцами QR-кодов и гостями. CouchDB, распределенная NoSQL база данных, которая работает по протоколу HTTP и хранит данные в формате JSON. Это делает её удобной для интеграции с веб-приложениями и клиентскими библиотеками, такими как PouchDB.


Доступ к тестовому серверу CouchDB

Тестовый сервер CouchDB для проекта "НаСвязи" доступен по следующему адресу:

Для управления базой данных и выполнения административных задач доступен встроенный интерфейс CouchDB — Fauxton:


Использование админ-панели Fauxton

Fauxton — это встроенный веб-интерфейс CouchDB, предоставляющий доступ к функциям управления базой данных, работы с документами, настройки безопасности и мониторинга изменений.

Основные действия в Fauxton

  1. Открытие Fauxton:

    • Перейдите по адресу https://hereconnect.condev.ru/api/_utils/.
    • Введите логин admin и пароль e1oQrcN4QN, чтобы получить доступ к панели управления.
  2. Создание базы данных:

    • На главной странице выберите "Databases" в боковом меню.
    • Нажмите "Create Database".
    • Введите имя новой базы данных и нажмите "Create", чтобы завершить создание.
  3. Работа с документами:

    • Перейдите в нужную базу данных.
    • Чтобы создать новый документ, нажмите "Add Document". Введите данные документа в формате JSON и нажмите "Save Document".
    • Чтобы отредактировать документ, выберите его из списка, внесите изменения и нажмите "Save Document". CouchDB создаст новую ревизию документа, сохранив изменения.
  4. Просмотр журнала изменений (Changes):

    • Внутри выбранной базы данных нажмите "Changes", чтобы увидеть все изменения (добавления, обновления или удаления документов).
    • Журнал изменений позволяет отслеживать версию каждого документа, что полезно при синхронизации данных и работе с автономными приложениями.
  5. Настройка безопасности:

    • В разделе "Permissions" можно настроить доступ к базе

Подключение к базе данных с помощью PouchDB

PouchDB — это клиентская библиотека для работы с CouchDB, которая позволяет использовать базу данных как на стороне клиента (в браузере), так и на сервере через HTTP. PouchDB обеспечивает совместимость с CouchDB, так что работа с локальной базой не отличается от работы с удаленной.

Основные операции с PouchDB

npm install pouchdb


```js
// Импорт PouchDB
import PouchDB from 'pouchdb-browser';

// Подключение к базе данных
const db = new PouchDB('https://hereconnect.condev.ru/api/qr', {skip_setup: true});
// или можно использовать локальную базу данных
// const db = new PouchDB('qr');

const qr_code_uri = '4n8x9z7q';

try {
  // Создание документа QR-кода
  await db.put({
    _id: `qr_code:${qr_code_uri}`,
    type: 'qr_code',
    uri: qr_code_uri,
    user_uuid: '01931a8b-220c-76df-943c-ea23313c7c65',
    name: 'Мой автомобиль',
    actions: ['send_message', 'share_location'],
    url: `https://hereconnect.condev.ru/${qr_code_uri}`,
    created_at: new Date().toISOString()
  });
  console.log('QR-код успешно создан');
} catch (error) {
  if (error.status === 409) {  // Статус 409 означает конфликт (документ уже существует)
    console.log(`QR-код с идентификатором ${qr_code_uri} уже существует.`);
  } else {
    console.error('Ошибка при создании QR-кода:', error);
  }
}

// Получение документа QR-кода
const qrCodeDoc = await db.get(`qr_code:${qr_code_uri}`);
console.log('QR-код:', qrCodeDoc);

// Обновление документа QR-кода (например, изменение имени)
const qrCodeForUpdate = await db.get(`qr_code:${qr_code_uri}`);
qrCodeForUpdate.name = 'Обновленное название объекта';
await db.put(qrCodeForUpdate);

// Удаление документа QR-кода
const qrCodeForDelete = await db.get(`qr_code:${qr_code_uri}`);
await db.remove(qrCodeForDelete);

// Создание документа сообщения от гостя
await db.put({
  _id: `message:${qr_code_uri}:1731317710358:1731317710358`,
  type: 'message',
  qr_code: qr_code_uri,
  chat: '1731317710358',
  created_at: '1731317710358',
  from: 'guest',
  content: 'Ваша машина мешает проезду',
  location: {
    lat: 55.7558,
    lng: 37.6176
  }
});

// Получение всех сообщений для конкретного QR-кода
const messages = await db.allDocs({
  startkey: `message:${qr_code_uri}:`,
  endkey: `message:${qr_code_uri}:\ufff0`,
  include_docs: true
});
messages.rows.forEach(row => console.log('Сообщение:', row.doc));


/ Отслеживание изменений в базе данных
db.changes({
  since: 'now',
  live: true
}).on('change', change => {
  console.log('Изменение в базе данных:', change);
});

// Синхронизация локальной и удаленной базы данных
const remoteDB = new PouchDB('https://hereconnect.condev.ru/api/qr');
db.sync(remoteDB, {
  live: true,
  retry: true
}).on('change', info => {
  console.log('Синхронизация: изменения обнаружены', info);
});

Ревизии документов

CouchDB использует ревизии (_rev) для отслеживания версий каждого документа. Каждое обновление документа создает новую ревизию, которая включает уникальный идентификатор. Это позволяет разрешать конфликты при синхронизации и помогает управлять историей изменений.

Создание новой ревизии происходит при каждом обновлении документа. Ревизия представлена в виде строки, состоящей из номера и хеша (например, 1-9c65296036141e575d32ba9c034dd3ee).

Конфликты ревизий возникают при параллельных изменениях одного документа. CouchDB сохраняет обе версии, и конфликт можно разрешить вручную.

Как работают ревизии

  • Создание новой ревизии: При каждом обновлении документа создается новая ревизия. CouchDB использует номера ревизий, которые включают префикс, указывающий версию изменения и хэш-значение, представляющее текущую версию данных. Например, ревизия может выглядеть как 1-9c65296036141e575d32ba9c034dd3ee, где 1 — версия, а 9c65296036141e575d32ba9c034dd3ee — уникальный хэш.

Использование _rev является обязательным для всех операций обновления и удаления документов, так как CouchDB требует указания текущей ревизии для предотвращения конфликтов данных. При создании нового документа указывать ревизию не требуется. CouchDB автоматически создает поле _rev для нового документа и присваивает ему начальную ревизию, которая обычно выглядит как 1-<хэш> (например, 1-9c65296036141e575d32ba9c034dd3ee).

  • Отслеживание изменений: _rev обновляется при каждом изменении документа. Для того чтобы внести изменения в документ, необходимо указать его текущую ревизию, иначе CouchDB вернет ошибку 409 Conflict, так как ожидает последнюю известную версию документа.

Пример использования ревизий

import PouchDB from 'pouchdb-browser';

const db = new PouchDB('https://hereconnect.condev.ru/api/qr', { skip_setup: true });
try {
  // Получение текущей версии документа
  const doc = await db.get(docId);
  
  // Изменение данных документа
  doc.name = 'Обновленное название объекта';
  
  // Сохранение документа с новой ревизией
  const response = await db.put(doc);
  console.log('Документ обновлен:', response);
} catch (error) {
  if (error.status === 409) {
    console.log('Конфликт: требуется обновить ревизию.');
  } else {
    console.error('Ошибка при обновлении документа:', error);
  }
}

Ревизии в CouchDB помогают обеспечить контроль версий документов, особенно при синхронизации данных и в распределенных системах.