2016-07-28 1 views
1

Предположим, что два пользователя вносят изменения в один и тот же документ в автономном режиме, но в разных разделах документа. Если пользователь 2 возвращается в сеть после пользователя 1, будут ли потеряны изменения, сделанные пользователем 1?Степень детализации Meteor GroundDB для автономной/онлайн-синхронизации

В моей базе данных каждая строка содержит объект JS, а одно свойство этого объекта - массив. Этот массив привязан к ряду ящиков на интерфейсе. Я бы хотел, чтобы, если два пользователя вносят изменения в эти флажки, последнее изменение сохраняется для каждого флажка отдельно, в зависимости от времени, когда было произведено изменение, а не времени синхронизации. Является ли GroundDB подходящим инструментом для достижения этого? Есть ли какое-либо значение для добавления обработчика событий, в котором я могу добавить некоторую логику, которая будет срабатывать при синхронизации, и это позаботится о слиянии?

ответ

1

Короткий ответ: «Да», ни одна из версий db для наземных версий не имеет разрешения конфликтов, поскольку логика настраивается в зависимости от поведения разрешения конфликтов, например. если вы хотите автоматизировать или привлечь пользователя.

Старая наземная база данных просто опиралась на разрешение конфликтов Метеор (последние данные на сервере выигрывают) Я предполагаю, что вы можете увидеть некоторые проблемы с этим, в зависимости от того, когда клиент приходит в Интернет.

У земли db II нет способа возобновления, это более или менее просто для кэширования данных в автономном режиме. Он наблюдает за наблюдаемым источником.

Я думаю, вы могли бы создать наблюдателя промежуточного программного обеспечения для GDB II, который проверяет локальные данные перед выполнением обновления и обновлением клиента или/и вызывает сервер для обновления данных сервера. Таким образом, у вас будет возможность справиться с конфликтами.

Я думаю, что помню, как писал код, который поддерживал «deletedAt»/«updatedAt» для некоторых типов обработки конфликтов, но опять-таки обработчик конфликта должен быть обычным для большинства. (открытие двери для повторного использования обработчиков конфликтов может быть полезно)

Осознание того, когда данные удаляются, может быть сложным, если вы не «мягко» удаляете что-то вроде использования объекта «deletedAt».

+0

Я установил Нулевой БД в прошлом месяце или два из https://atmospherejs.com/ground/db. Является ли этот наземный DB II? –

+0

Кроме того, есть ли у Groud DB II резерв для этого промежуточного наблюдателя? Или мне придется разветвить все это? Все мои флажки в пользовательском интерфейсе привязаны к объекту с состоянием флажка (true или false), идентификатором пользователя, внесшего изменения, и датой изменения. Поэтому мне нужно будет сравнить эти данные с тем, что это БД, до того, как документ будет обновлен, и иметь возможность отменить обновление или позволить ему работать. Не могли бы вы дать мне подсказку о том, где я могу связать такой код? –

+0

Кстати, я ценю получение ответа от автора библиотеки. :) –

0

Филиал "гс" в настоящее время grounddb кеширования-2016 версия "2.0.0-rc.4",

Я думал о чем-то вроде: (ум это не испытано, написано непосредственно в SO)

// Create the grounded collection 
foo = new Ground.Collection('test'); 

// Make it observe a source (it's aware of createdAt/updatedAt and 
// removedAt entities) 
foo.observeSource(bar.find()); 

bar.find() возвращает курсор с функцией observe нашего промежуточного слоя должны делать то же самое. Давайте создадим createMiddleWare помощника для него:

function createMiddleWare(source, middleware) { 
    const cursor = (typeof (source||{}).observe === 'function') ? source : source.find(); 
    return { 
    observe: function(observerHandle) { 
     const sourceObserverHandle = cursor.observe({ 
     added: doc => { 
      middleware.added.call(observerHandle, doc); 
     }, 
     updated: (doc, oldDoc) => { 
      middleware.updated.call(observerHandle, doc, oldDoc); 
     }, 
     removed: doc => { 
      middleware.removed.call(observerHandle, doc); 
     }, 
     }); 
     // Return stop handle 
     return sourceObserverHandle; 
    } 
    }; 
} 

Использование:

foo = new Ground.Collection('test'); 

foo.observeSource(createMiddleware(bar.find(), { 
    added: function(doc) { 
    // just pass it through 
    this.added(doc); 
    }, 
    updated: function(doc, oldDoc) { 
    const fooDoc = foo.findOne(doc._id); 

    // Example of a simple conflict handler: 
    if (fooDoc && doc.updatedAt < fooDoc.updatedAt) { 
     // Seems like the foo doc is newer? lets update the server... 
     // (we'll just use the regular bar, since thats the meteor 
     // collection and foo is the grounded data 
     bar.update(doc._id, fooDoc); 
    } else { 
     // pass through 
     this.updated(doc, oldDoc); 
    } 
    }, 
    removed: function(doc) { 
    // again just pass through for now 
    this.removed(doc); 
    } 
}));