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 oldukça fazla ön hazırlık yapmanız 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 nesnesi 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()
yöntemi.
Kendi anahtarlarınızı oluşturursanız anahtarlarınız UTF-8 kodlamalı olmalı, en fazla 768 bayt uzunluğunda olmalı ve .
, $
, #
, [
, ]
, /
veya ASCII kontrol karakterleri 0-31 ya da 127 içermemelidir. 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, daha bakımı kolay kod yazmanıza yardımcı olmak için mevcut JSON türlerine karşılık gelen belirli yerel türler olarak temsil edilebilir.
Veri yapısıyla ilgili en iyi uygulamalar
Verileri iç içe yerleştirmekten kaçının
Firebase Realtime Database, verileri 32 düzeye kadar iç içe yerleştirmeye izin verdiğinden bunun varsayılan yapı olması gerektiğini düşünebilirsiniz. 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": { ... } } }
Bu iç içe yerleştirilmiş tasarımda, veriler arasında iterasyon 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 genellikle bir listenin alt kümesini indirmek 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.