Есть ли способ использовать OT или CRDT (или что-то подобное) для реляционных данных?
Я работаю над процессом синхронизации между автономными первыми базами данных и центральным сервером. В качестве простого примера можно привести элементы и отделы, а элемент принадлежит отделу. Каждый клиент может изменить любую из сущностей.
Я знаю, что для текстовых документов существуют алгоритмы / технологии для обработки конфликтов, такие как OT и CRDT:
- https://en.wikipedia.org/wiki/Operational_transformation
- https://en.wikipedia.org/wiki/Conflict-free_replicated_data_type
- Различия между OT и CRDT
Но мне интересно, если вы можете использовать их для более сложных структур, как вы могли бы иметь в базе данных. В моем случае давайте будем проще и скажем, что у вас есть:
- элементы - идентификатор, имя, отдел_идентификатор
- отделы - идентификатор, название
Изменения в свойствах, таких как "имя" в отдельных элементах, являются управляемыми (возможно, с использованием версии, дельты, отметки времени). Удаление немного сложнее, но вы можете просто отменить изменение имени, потому что элемент удален.
И еще сложнее, когда есть отношения. Что происходит, когда один клиент перемещает элементы в отдел, а другой удаляет отдел.
На определенном уровне некоторые из этих конфликтов похожи на те, которые могут возникнуть в тексте с использованием OT. Кто-то меняет название, а кто-то удаляет его. Или кто-то добавляет элемент в маркированный список, а кто-то перемещает список в другую часть документа.
Мой вопрос: можете ли вы использовать OT или CRDT для реляционных данных, и если да, то как бы вы это сделали? Если нет, существуют ли другие подобные алгоритмы или методы для обработки конфликтов в реляционных данных?
1 ответ
В последнее время появилось несколько инструментов, предоставляющих реляционные базы данных, которые синхронизируются с использованием CRDT. Те, о которых я знаю:
- VLCN: расширение SQLite, которое синхронизирует базы данных по произвольным сетям (например, WebSocket с центральным сервером).
- ElectricSQL: платформа, которая синхронизирует клиентские базы данных SQLite и серверную базу данных Postgres.
- TinyBase: хранилище данных браузера с возможностью синхронизации данных с помощью плагинов CRDT.
С академической точки зрения в этих статьях описываются «Бесконфликтные реплицируемые отношения (CRR)», общий подход к моделированию реляционных данных с использованием CRDT:
- Вейхай Ю и Клаудия-Лавиния Игнат. Бесконфликтные реплицированные отношения для мультисинхронного управления базами данных на периферии. На Международной конференции IEEE по интеллектуальным службам передачи данных , SMDS 2020, страницы 113–121. IEEE, октябрь 2020 г. Официальный , препринт .
- Ивер Тофт Томтер и Вэйхай Ю. Дополнение SQLite для локального программного обеспечения. На Европейской конференции по достижениям в области баз данных и информационных систем , ADBIS 2021, страницы 247–257. Springer, август 2021 г. Официальный препринт .