sql >> Databáze >  >> NoSQL >> MongoDB

Modelování podsbírek v MongoDB Realm Sync

Váš kód vypadá skvěle a míříte správným směrem, takže tato odpověď je spíše vysvětlením a návrhy ohledně modelování než pevným kódem.

Za prvé, objekty Realm jsou líně načteno což znamená, že se načítají pouze při použití. Desítky tisíc objektů budou mít velmi malý dopad na paměť zařízení. Předpokládejme tedy, že máte 10 000 uživatelů a „nahrajete je všechny“

let myTenThousandUsers = realm.objects(UserClass.self)

meh, nic moc. Nicméně, dělat to

let someFilteredUsers = myTenThousandUsers.filter { $0.blah == "blah" }

vytvoří (mohlo by) způsobit problém – pokud to vrátí 10 000 uživatelů všichni jsou načteni do paměti případně zahlcení zařízení. To je funkce Swift a „převádění“ líných dat Realms pomocí Swift by se mělo obecně vyhnout (závisí na případu použití)

Pozorování tohoto kódu pomocí Swift .forEach

realm.objects(Project.self).forEach { (project) in
   // Access fields     
}

může způsobit problémy v závislosti na tom, co se s těmito objekty projektu dělá – jejich použití jako tableView dataSource může být problematické, pokud jich je hodně.

Druhá věc je otázka ohledně limitu 16 Mb na dokument. Pro přehlednost je dokument Atlas toto

{
   field1: value1,
   field2: value2,
   field3: value3,
   ...
   fieldN: valueN
}

kde hodnota může být libovolný datový typ BSON, jako jsou jiné dokumenty, pole a pole dokumentů.

Ve vaší struktuře var tasks = RealmSwift.List<Task>() kde Task je vložený objekt . Zatímco koncepčně vložené objekty jsou objekty, věřím, že se počítají do limitu jednoho dokumentu, protože jsou vložené (opravte mě, pokud se mýlím); jak jejich počet roste, roste i velikost přiloženého dokumentu – mějte na paměti, že 16 Mb textu je OHROMNÉ textu, takže by to mohlo/mohlo odpovídat milionům úkolů na projekt.

Jednoduchým řešením je nevkládat je a nechat je stát samostatně.

class Task: Object {
    @objc dynamic var _id: String = ObjectId.generate().stringValue
    @objc dynamic var _partition: String = "" 
    @objc dynamic var name: String = ""
    @objc dynamic var status: String = "Pending"
    override static func primaryKey() -> String? {
        return "_id"
    }
}

Každý z nich pak může mít 16 Mb a k jednomu projektu lze přiřadit „neomezený počet“. Jednou z výhod vložených objektů je typ kaskádového mazání, kdy když je odstraněn nadřazený objekt, podřízené objekty jsou také, ale se vztahem 1-many mezi Projectem a Tasks - odstranění hromady úkolů patřících nadřazenému je snadné.

Oh - další případ pro nepoužívání vložených objektů - zejména pro tento případ použití - je, že nemohou mít indexované vlastnosti. Indexování může výrazně urychlit některé dotazy.




  1. Chyba křížového slotu Redis

  2. Vložte prvek do vnořených polí v MongoDB

  3. Odeslání JSON do Flask má za následek chybu 400 Bad Request

  4. Čtení, psaní a skladování JSON s uzlem na Heroku