Bu kılavuzda, veri mimarisi alanındaki temel kavramlardan bazıları ve en iyi Firebase Realtime Database içinde JSON verilerini yapılandırma ile ilgili daha fazla bilgi edinin.
Düzgün yapılandırılmış bir veritabanı oluşturmak için çok fazla kafa yorulması gerekir. En önemlisi de verilerin nasıl kaydedileceğini ve hale getirebileceğimizi düşünüyoruz.
Veriler nasıl yapılandırılır? Bir JSON ağacıdır
Tüm Firebase Realtime Database verileri JSON nesneleri olarak depolanır. Örneğin,
veritabanını bulutta barındırılan JSON ağacı olarak kullanabilirsiniz. SQL veritabanının aksine
tabloları veya kayıtları. JSON ağacına veri eklediğinizde, bu veriler
ilişkili anahtara sahip mevcut JSON yapısına sahiptir. Kendi anahtarlarınızı sağlayabilirsiniz.
kullanıcı kimlikleri veya anlamsal adlar gibidir ya da
push()
.
Kendi anahtarlarınızı oluşturursanız bunların UTF-8 olarak kodlanmış olması gerekir, en fazla sayı olabilir
768 bayttır ve .
, $
, #
, [
, ]
, /
veya ASCII kontrolü içeremez
0-31 veya 127 karakter uzunluğunda olmalıdır. Değerlerde ASCII kontrol karakterlerini kullanamazsınız
kendileri de.
Örneğin, kullanıcıların temel bilgileri saklamasına olanak tanıyan bir sohbet
profil ve kişi listesi. Tipik bir kullanıcı profili bir yolda bulunur:
/users/$uid
alovelace
adlı kullanıcının
aşağıdaki gibi görünür:
{ "users": { "alovelace": { "name": "Ada Lovelace", "contacts": { "ghopper": true }, }, "ghopper": { ... }, "eclarke": { ... } } }
Veritabanı bir JSON ağacı kullansa da, veritabanında depolanan veriler Kullanılabilir JSON türlerine karşılık gelen belirli yerel türlerle gösterilir kod yazmanızı ister.
Veri yapısı için en iyi uygulamalar
Verileri iç içe yerleştirmekten kaçının
Firebase Realtime Database, verilerin 32 seviyeye kadar derine yerleştirilmesine izin verdiğinden bunun varsayılan yapı olması gerektiği düşünülebilir. Ancak, veritabanınızdaki bir konuma veri getirdiğinizde, tüm alt düğümlerini kontrol eder. Ayrıca bir kullanıcıya okuma veya yazma erişimi verdiğinizde erişim izni verirseniz, veritabanınızdaki tüm verilere erişim izni de verirsiniz. düğüm. Bu nedenle, uygulamada en iyi uygulama, veri yapınızı olabildiğince düz yardımcı olabilirsiniz.
İç içe yerleştirilmiş verilerin neden kötü olduğuna dair bir örnek için aşağıdakileri göz önünde bulundurun: çoklu iç içe yerleştirilmiş yapı:
{ // This is a poorly nested data architecture, because iterating the children // of the "chats" node to get a list of conversation titles requires // potentially downloading hundreds of megabytes of messages "chats": { "one": { "title": "Historical Tech Pioneers", "messages": { "m1": { "sender": "ghopper", "message": "Relay malfunction found. Cause: moth." }, "m2": { ... }, // a very long list of messages } }, "two": { ... } } }
İç içe yerleştirilmiş bu tasarımda, verilerde yineleme yapmak sorunlu hale gelir. Örneğin,
Örneğin, sohbet görüşmelerinin başlıklarını listelemek için tüm chats
gerekir
ağaçları (tüm üyeler ve iletiler dahil olmak üzere) istemciye indirecektir.
Veri yapılarını birleştirin
Veriler, denormalizasyon olarak da bilinen ayrı yollara bölünürse gerektiğinde ayrı görüşmelerde verimli bir şekilde indirilebilir. Dikkatlice yapın:
{ // Chats contains only meta info about each conversation // stored under the chats's unique ID "chats": { "one": { "title": "Historical Tech Pioneers", "lastMessage": "ghopper: Relay malfunction found. Cause: moth.", "timestamp": 1459361875666 }, "two": { ... }, "three": { ... } }, // Conversation members are easily accessible // and stored by chat conversation ID "members": { // we'll talk about indices like this below "one": { "ghopper": true, "alovelace": true, "eclarke": true }, "two": { ... }, "three": { ... } }, // Messages are separate from data we may want to iterate quickly // but still easily paginated and queried, and organized by chat // conversation ID "messages": { "one": { "m1": { "name": "eclarke", "message": "The relay seems to be malfunctioning.", "timestamp": 1459361875337 }, "m2": { ... }, "m3": { ... } }, "two": { ... }, "three": { ... } } }
Artık yalnızca bir tek dosya indirerek oda listesini yinelemek mümkün. Sohbet başına birkaç bayt, listeleme veya görüntüleme için meta verileri hızlı bir şekilde getirir bir kontrol panelidir. İletiler ayrı ayrı alınıp geldikçe görüntülenebilir. bu da, kullanıcı arayüzünün duyarlı ve hızlı kalmasına olanak tanıyor.
Ölçeklenen veriler oluşturun
Uygulama oluştururken listenin bir alt kümesini indirmek genellikle daha iyidir. Bu durum, özellikle listede binlerce kayıt varsa yaygın bir durumdur. Bu ilişki statik ve tek yönlü olduğunda, tablodaki alt nesneleri de içerir.
Bazen bu ilişki daha dinamik olabilir veya bu verileri denormalize edebilirsiniz. Birçok kez, bir sorgu kullanarak verileri normalleştirme aşağıdaki örnekte açıklandığı gibi, verilerin bir alt kümesini almak için Verileri Al.
Ancak bu değer bile yeterli olmayabilir. Örneğin, iki taraflı bir ilişki nasıl değiştirebileceğinizi anlatabilirsiniz. Kullanıcılar bir gruba ait olabilir ve gruplar bir kullanıcı listesi. Bir kullanıcının ait olduğu gruplara karar verirken işler karmaşıklaşır.
Gerekli olan, kullanıcının ait olduğu grupları listelemenin yalnızca bu gruplara ait verileri getirir. Grup dizini, burada bulabilirsiniz:
// An index to track Ada's memberships { "users": { "alovelace": { "name": "Ada Lovelace", // Index Ada's groups in her profile "groups": { // the value here doesn't matter, just that the key exists "techpioneers": true, "womentechmakers": true } }, ... }, "groups": { "techpioneers": { "name": "Historical Tech Pioneers", "members": { "alovelace": true, "ghopper": true, "eclarke": true } }, ... } }
Bunun, ilişki saklayarak bazı verilerin yinelendiğini fark edebilirsiniz
altında ve grup altında bulabilirsiniz. alovelace
artık dizine eklendi
grubu (techpioneers
) Ada'nın profilinde listelenir. Ada'yı silmek için:
iki yerde güncellenmesi gerekir.
Bu, iki yönlü ilişkilerde gerekli bir gereksizliktir. Bu sayede kullanıcıların listesi veya paydaşlardan oluşan bir liste ya da gruplar milyonlara ulaştığında veya Realtime Database güvenlik kuralı tarafından bazı kayıtlara erişememesini sağlayabilirsiniz.
Bu yaklaşım, kimlikleri anahtar olarak listeleyip
değeri True olarak ayarlayın, bir anahtarı kontrol etmek kadar kolay
/users/$uid/groups/$group_id
ve null
olup olmadığı kontrol ediliyor. Dizin daha hızlı
ve verileri sorgulamak veya taramaktan çok daha verimlidir.