2013-04-22 19 views
10

Aşağıdakilerden yola çıkılarak ilişkisel bir veritabanı modeli için hangi temel anahtar stratejinin kullanılması en iyi sonuç olur?Merkezi mağaza olarak SQLite ve Azure SQL veritabanı ile çevrimiçi/çevrimdışı çok müşterili bir mobil uygulama için en iyi birincil anahtar stratejisi hangisidir?

  • onlarca kullanıcıları kullanıcı başına
  • birden istemcileri (telefon, tablet masaüstü) (sürekli büyüyen) masanın başına satır
  • milyonlarca binlerce

Azure SQL merkezi veri olacak Web API ile açıklanacak mağaza. İstemciler bir web uygulaması ve iOS, Android, Mac, Windows 8, vb. Dahil olmak üzere bir dizi yerel uygulama içerecektir. Web uygulaması “her zaman açık” bir bağlantı gerektirecektir ve yerel bir veri deposuna sahip olmayacak ancak bunun yerine geri getirecek ve güncelleyecektir. api yoluyla - RESTful API yoluyla CRUD düşünün.

Diğer tüm istemciler (telefon, tablet, masaüstü) yerel bir db'ye (SQLite) sahip olacaktır. Bu tür bir müşterinin ilk kullanımında, kullanıcının kimlik doğrulaması yapması ve senkronize etmesi gerekir. Kimliği doğrulandıktan ve senkronize edildikten sonra, bu istemciler çevrimdışı modda çalışabilir (yerel SQLite db'de kayıt oluşturma, silme ve güncelleme). Bu değişiklikler sonunda Azure arka ucuyla senkronize edilir.

Veritabanlarının dağınık yapısı bizi birincil anahtar problemle ve bu soruyu sorma nedeniyle bırakıyor. İşte

biz şimdiye kadar ele aldığımız şeydir:

GUID

Her istemci kendi anahtarlar oluşturur. Eşzamanlı olarak, yinelenen bir anahtar için çok küçük bir şans vardır, ancak yeni bir anahtarla tüm ilişkileri güncellemek için her bir istemciye işlev yazarak bunu hesaba katmamız gerekir. GUID'ler büyüktür ve tablo başına birden çok yabancı anahtar dikkate alındığında, depolama zamanla bir sorun haline gelebilir. Muhtemelen en büyük sorun, GUID'lerin rastgele doğasıdır, bu da parçalanma nedeniyle kümelenmiş indeks olarak kullanılamayacaklarını (veya kullanmamaları) ifade eder. Bu, her tablo için kümelenmiş bir dizin (belki de keyfi) oluşturmamız gerektiği anlamına gelir.

Kimlik

Her istemci kendi birincil anahtarlar oluşturur. Senkronizasyonda, bu anahtarlar sunucu tarafından oluşturulan anahtarlarla değiştirilir. Bu, senkronizasyon sürecine ek karmaşıklık ekler ve her müşteriyi ilgili tablolardaki tüm yabancı anahtarlar dahil olmak üzere anahtarlarını “düzeltmek” üzere zorlar.

Kompozit

Her istemci ilk senkronizasyonu istemci kimliği atanır. Bu istemci kimliği, her tablo için bir bileşik birincil anahtar olarak bir yerel otomatik arttırma kimliğiyle birlikte kullanılır. Bu birleşik anahtar benzersiz olacaktır, bu nedenle senkronizasyonda çakışma olmamalı, ancak çoğu tablonun birleşik bir birincil anahtar gerektireceği anlamına gelir. Performans ve sorgu karmaşıklığı burada endişe kaynağıdır.

HiLo (Birleştirilmiş Kompozit), her istemci istemci kimliği tek bir benzersiz yerel kimliği (int32) ile birleştirilir ilk senkronizasyonu istemci kimliği (int32) atanır kompozit yaklaşımı gibi

Bir uygulama geniş benzersiz id (int64) yapmak için sütun. Bu, senkronizasyon sırasında çakışma olmamalıdır.Her bir istemci tarafından oluşturulan kimlikler ardışık olduğu için bu anahtarlar ve GUID'ler arasında daha fazla sıra bulunsa da, binlerce benzersiz istemci-kimliği olacaktır, bu yüzden kümelenmiş dizinimizde hala parçalanma riskini mi kullanıyoruz?

Bir şeye mi bakıyoruz? Araştırmaya değer başka yaklaşımlar var mı? Her yaklaşımın artıları ve eksileri hakkında bir tartışma oldukça yararlı olacaktır.

+0

Sonuçta, "en iyi" strateji diğer gereksinimlerinize bağlıdır. Bunların hepsi çok geçerli seçenekler. Belki de sorunuzu, "Bu temel anahtar stratejilerin her birinde en mantıklı senaryolar hangileri yapar?" Şeklinde yeniden yazmalısınız. – Jaxidian

+0

Benzer veritabanı/uygulama yapımız için, kullanıcıların önce bir hesap açtığını ve tüm veri depolama alanlarını bu hesaba dayandığımızı biliyoruz. Hesapla başa çıkmak, öncelikle tüm yasal yükümlülükleri ve bilgilerin saklanma haklarını ele alır. – HalR

+0

@Jaxidian Önerdiğiniz soru ilginç bir tartışmaya yol açsa da, söz konusu soruda belirtildiği gibi bizim durumumuz için en uygun olan bir çözüm arıyorum. – user1843640

cevap

0

Hatırlanması gereken anahtar (noktalama amaçlı) şey, kalıcı depoda sakladığınız her nesne için benzersiz bir anahtara sahip olmaktır. Bu nesnenin depolanması tamamen size bağlıdır ve bu anahtara nasıl eriştiğinizin metodolojisine kadar. Listelediğiniz stratejilerin her birinin neden yaptıklarıyla ilgili nedenleri vardır, ancak sonunda db'de belirli bir nesne için bir anahtar saklıyorlar, böylece tüm özellikleri aynı veri kaynağını veritabanında saklarken değiştirilebilir. .

İlgili konular