2017-10-20 47 views
0

J'étais curieux de savoir s'il existait un moyen de simplifier mes requêtes DB Firebase.Swift: Simplification de l'extraction de base de données imbriquée/requêtes

En outre, quelles sont les meilleures pratiques à suivre lors de la création de demandes d'extraction. J'ai remarqué que plus ma structure hiérarchique est complexe à cause de l'ajout d'enfants, plus les requêtes sont ardues et longues dans mon code.

Voici un exemple d'une requête dans mon application: enter image description here

enter image description here

Répondre

0

Si vous vous trouvez besoin des requêtes complexes, le plus probable signifie que vos données ne sont pas correctement structuré. Dans votre cas, votre structure doit être normalisée (aplatie).

La modification suivante doit rendre vos requêtes plus simples:

{ 
    "listings": { 
    "listing_key_1": { 
     "timestamp": "2017 10 19 07:49:38" 
    }, 
    "listing_key_2": { 
     "timestamp": "2017 10 19 05:30:02" 
    }, 
    ... 
    }, 

    "AircraftHouseRules": { 
    "listing_key_1": { 
     "Availability": "", 
     ... 
    }, 
    "listing_key_2": { 
     "Availability": "", 
     ... 
    } 
    }, 

    "BasicInfo": { 
    "listing_key_1": { 
     "ModelPlane": "", 
     ... 
    }, 
    "listing_key_2": { 
     "ModelPlane": "", 
     ... 
    } 
    }, 
    ... 
} 

Je ne comprends pas ce que vous entendez par « tirer les demandes ». Si vous voulez dire observer ou simplement lire les données, c'est assez simple. Tout ce dont vous avez besoin dans votre cas est un ID/clé listing pour accéder directement à ses données (AircraftHouseRules, BasicInfo, DetailedInformation, etc ...).

Si vous voulez que l'inverse (pour obtenir la clé d'une liste par, disons, son TypeOfPlane), vous pouvez faire la requête suivante

// NOTE: Untested code - just for illustrative purposes 
let queryRef = Database().database.reference.child("BasicInfo").queryOrdered(byChild: "TypeOfPlane").queryEqual(to: "some type") 

queryRef.observeSingleEvent(of: .value, with { snapshot in 
    if let listings = snapshot.value as? [String : Any] { 
     // all retrieved listings with TypeOfPlane == "some type" 
    } 
}) 

Conseils

Vous devriez toujours avoid nesting structures pour éviter de télécharger des données inutiles et d'entraver les performances. Dans la capture d'écran que vous avez affichée, vous avez jusqu'à 8 niveaux de données imbriquées. Avec la modification ci-dessus, vous pouvez facilement réduire ces niveaux de moitié.

Vous devez également envisager de remplacer toutes les structures matricielles (telles que celles sous ImageRef) par des paires valeur/clé sous la forme arrays can be evil.

+0

Merci pour les recommandations. Je vais faire des changements. – Cari95