Veritabanınızı Yapılandırma

Bu kılavuzda, veri mimarisi alanındaki temel kavramlardan bazıları ve en iyi Firebase Realtime Database'inizde JSON verilerini yapılandırma.

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 POST isteği.

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 seviye derine kadar iç içe yerleştirilmesine olanak tanıdığından 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 veya Realtime Database güvenlik kuralları ihlal edildiğinde veya 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.

Sonraki adımlar