Bir mobil istemci ile sunucu arasındaki referans bütünlüğünü korumak


21

Bu yüzden nispeten basit bir sistem var. Bir mobil istemci, uzak bir SQL sunucusuyla (diğer mobil istemcilerle paylaşılıyor) senkronize etmek istediğim bir sqlite veritabanında kayıtlar oluşturuyor . Bu yüzden, telefonun sqlite tablosunda yeni bir kayıt oluşturduğumda, bu değişikliği bir RESTful API üzerinden uzaktan servisime iletiyorum. Karşılaştığım sorun , birincil anahtarları nasıl verip çarpışma olmaması için nasıl sipariş verdiğimdir (yani, telefondaki bir kayıt sunucudaki tamamen farklı bir kayıtla aynı birincil anahtara sahiptir). İstemcideki kaydı referanslamak ve sunucudaki aynı kaydı referanslamak için kullanılan en iyi uygulama nedir?


1
Aşırı derecede fikir sahibi olan fikir, müşterinin web sunucusu için bir önbellek görevi görmesi, istemcide değişikliklerin yaratılması ve ardından web sunucusuna itilmesi olabilirdi
JoeCortopassi,

Yanıtlar:


22

Normal uygulama veritabanınızı uniqueidentifieranahtarlarla (bazen UUID veya GUID olarak adlandırılır) yapılandırmaktır . Gerçekçi çarpışma korkusu olmadan iki yerde yaratabilirsiniz.

Ardından, yeni satırlar oluşturabilmeniz için önce Mobil uygulamanızın "olgu" tablolarını sunucudan senkronize etmesi gerekiyor. Yeni satırlar oluşturduğunuzda, bunu yerel olarak yaparsınız ve tekrar senkronize ettiğinizde sunucuya yeni satırlar eklenir. Aynı şeyi güncelleme ve silme işlemleriyle de yapabilirsiniz.

Ekleri izlemek için, satırlarınızda bir Oluşturulmuş zaman damgasına ihtiyacınız var. Güncellemeleri izlemek için satırlarınızda bir LastUpdate zaman damgasını izlemeniz gerekir. Silme izlerini izlemek için bir mezar masasına ihtiyacınız var.

Bir senkronizasyon yaptığınızda, sunucu ile mobil cihaz arasındaki zaman farkını kontrol etmeniz ve çatışmaları çözmek için bir yönteme sahip olmanız gerektiğini unutmayın. Eklemeler önemli değil (çakışmamalılar), ancak güncellemeler çakışabilir ve bir silme bir güncelleme ile çakışabilir.

Microsoft Sync Framework gibi bu tür şeyleri ele almak için çerçeveler vardır .


hala hayatta eşitleme çerçevesi
Sadaquat

7

Eminim kesinlikle, soru olmadan ikisi arasında referans bütünlüğü olamaz . Özellikle, kullanıcılarınız mobil uygulamanın bağlantısı kesildiğinde çalışmasını bekliyor mu?

Bunun için iki uygulama var:

Bunlardan biri istemcide "geçici" kayıtlar oluşturmak ve ardından sunucuya senkronize ettiğinizde merkezi sistemin kimliğini atamasını sağlamak. Müşteri bunu yansıtmak için yerel kaydı güncelleyebilir.

Diğeri, kimlik oluşturmayı (normalde olasılıkla) istemcilerin kimliği olmadan kimlik oluşturmasına izin verecek şekilde dağıtmanızdır.

Bunun için UUID'lere git - v4'ün çarpışması pek mümkün değil.

Aksi takdirde, benzersiz mobil cihaz kimliğini kayıt kimliğine yerleştiren bir şey düşünün. Dolayısıyla, kayıt kimliğiniz ${imei}-${local sequence number}IMEI'nin benzersizliği sağladığı ve yerel sıra numarasının normal sıralı bir veritabanı kimliği olduğu bir şey olabilir.



0

Üzerinde çalışmakta olduğum bir projeyle aynı sorunu yaşıyorum, benim durumumdaki çözüm remote_id adlı yerel tablolarda fazladan boş bir alan yaratmaktı. Remote_id null değerindeyse kayıtları yerelden uzak veritabanına senkronize ederken, bu satırın hiç senkronize edilmediği ve uzak satır kimliğiyle eşleşen benzersiz bir kimlik döndürmesi gerektiği anlamına gelir.

Local Table            Remote Table

_id (used locally)
remote_id ------------- id
name      ------------- name

İstemci uygulamasında tabloları _id alanına bağlarım, uzaktan veri toplamak, birleştirmek, vb. Yapmak için uzaktaki id alanını kullanırım.

yerel olarak örnek:

Local Client Table       Local ClientType Table      Local ClientType
                         _id
                         remote_id  
_id -------------------- client_id
remote_id                client_type_id -------------- _id
                                                      remote_id
name                    name                          name

uzaktan örnek:

Remote Client Table      Remote ClientType Table      Remote ClientType
id -------------------- client_id
                        client_type_id -------------- id
name                    name                          name

Bu senaryo ve kodda herhangi bir mantık olmadan, client_type tablosu yerel ya da uzak tablolardaki gerçek kimlikle eşleşmeyebileceği için veri bütünlüğü hatalarına neden olur, bunun için bir remote_id oluşturulduğunda, istemci uygulamasına bir sinyal verir yerel _id alanını güncellemek isteyen bu, etkilenen tabloları güncelleyerek sqlite'da önceden oluşturulmuş bir tetikleyiciyi tetikler. http://www.sqlite.org/lang_createtrigger.html

1- remote_id sunucuda üretildi

2- müşteriye bir sinyal verir

3- müşteri _id alanını günceller ve yerel _id'e katılan yerel tabloları güncelleyen bir tetikleyici başlatır

Tabii ki, senkronizasyonlara yardımcı olmak ve çoğaltılmış senkronizasyonlardan kaçınmak için bir last_updated alanını da kullanıyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.