"Core Data n'est pas une database relationnelle." Pourquoi est-ce important de le savoir?

Je réalise que cela peut être du bon sens pour beaucoup de gens, alors excuses si cela semble être une question stupide.

J'essaie d'apprendre des données de base pour la programmation iOS, et j'ai lu à plusieurs resockets et entendu dire que Core Data (CD) n'est pas une database relationnelle. Mais on en dit très peu à ce sujet, ou pourquoi exactement il est important de savoir au-delà d'un sens académique. Je veux dire fonctionnellement au less, il semble que vous pouvez utiliser CD comme s'il s'agissait d'une database pour la plupart des choses – stocker et récupérer des données, des requêtes de runnings, etc. De ma compréhension très rudimentaire, je ne vois pas vraiment database.

Je ne remets pas en question le fait que la distinction est importante. Je crois que beaucoup de gens intelligents ne perdraient pas leur time sur ce point s'il n'était pas utile de comprendre. Mais j'aimerais que quelqu'un vous explique – idéalement avec des exemples – comment le CD n'est pas une database relationnelle et affecte la façon dont nous l'utilisons? Ou peut-être, si on ne me dit pas que CD n'est pas une database relationnelle, comment cela pourrait-il avoir un impact négatif sur mes performances en tant que programmeur Objective-C / Swift?

Y at-il des choses que l'on pourrait essayer de faire incorrectement si elles traitaient CD comme une database relationnelle? Ou y a-t-il des choses qu'une database relationnelle ne peut pas faire ou fait less bien que ce CD est conçu pour faire?

Merci à tous pour votre sagesse collective.

    Les users mettent l'accent sur l'angle "pas une database relationnelle" car les personnes ayant une certaine expérience dans la database sont sujettes à des erreurs spécifiques avec les Données de base qui résultent d'une tentative d'application trop directe de leur expérience. Quelques exemples:

    • Création d'entités qui sont essentiellement des tables de jonction SQL. Ceci n'est presque jamais nécessaire et rend généralement les choses plus complexes et sujettes aux erreurs. Les données de base prennent directement en charge les relations plusieurs-à-plusieurs.
    • Création d'un champ ID unique dans une entité, car ils pensent en avoir besoin pour garantir l'unicité et créer des relations. Parfois, la création d'ID uniques personnalisés est utile, généralement pas.
    • Configurer des relations entre des objects basés sur ces ID uniques au lieu d'utiliser les relations de données de base, c'est-à-dire save l'ID unique d'un object associé au lieu d'utiliser la sémantique ObjC / Swift pour relier les objects.

    Les données de base peuvent souvent servir de database, mais le fait d'y penser en termes d'autres bases de données relationnelles est un bon moyen de bousiller les choses.

    Core Data est une technologie avec de nombreuses fonctionnalités et outils puissants tels que:

    1. Changer le suivi (annuler / rétablir)
    2. Faulting (ne pas avoir à charger des objects entiers qui peuvent économiser de la memory)
    3. Persistance

    La list continue..

    La partie de persistance des données de base est soutenue par SQLite, qui est une database relationnelle.

    L'une des raisons pour lesquelles les gens insistent sur le fait que datatables de base ne sont pas une database relationnelle est parce que c'est beaucoup plus qu'une simple persistance, et que l'on peut en profiter sans utiliser la persistance.

    En traitant datatables de base comme une database relationnelle, je suppose que vous voulez dire que les relations entre les objects sont mappées par des identifiants, par exemple un client a un customerId et un produit a un productId. Ce serait certainement incorrect car Core Data vous permet de définir des relations puissantes entre les templates d'objects qui rendent les choses faciles à gérer.

    Par exemple, si vous souhaitez que votre client possède plusieurs produits et que vous souhaitiez les supprimer tous lorsque vous supprimez le client, Core Data vous permet de le faire sans avoir à gérer customerIds / productIds et à déterminer comment mettre en forme des requêtes SQL complexes. pour correspondre à votre model en memory. Avec Core Data, il vous suffit de mettre à jour votre model et de sauvegarder votre context, le SQL est fait pour vous sous le capot. (En fait, vous pouvez même activer le debugging pour imprimer datatables SQL Core que vous effectuez en passant '-com.apple.CoreData.SQLDebug 1' comme argument de lancement.

    En termes de performances, Core Data effectue des optimizations sérieuses sous le capot qui facilitent considérablement l'access aux données sans devoir plonger dans le SQL, la concurrency ou la validation.

    Je pense que le point est qu'il est différent d'une database relationnelle et que la tentative d'appliquer des techniques relationnelles va égarer le développeur comme d'autres l'ont mentionné. Il fonctionne réellement à un niveau supérieur en extrayant la fonctionnalité de la database relationnelle de votre code.

    Une différence essentielle, du sharepoint vue de la programmation, est que vous n'avez pas besoin d'identifiants uniques, car datatables de base ne traitent que cela. Si vous avez essayé de créer le vôtre, vous verrez qu'ils sont redondants et qu'il y a beaucoup de problèmes supplémentaires.

    Du sharepoint vue du programmeur, chaque fois que vous accédez à un «logging» d'entité, vous aurez un pointeur vers n'importe quelle relation – peut-être un seul pointeur pour une relation «à un» ou un set de pointeurs vers beaucoup "relation". Les données de base traitent la récupération des "loggings" réels lorsque vous utilisez l'un des pointeurs.

    Parce que datatables de base traitent efficacement les fautes (où le "record" (object) référencé par un pointeur n'est pas en memory) vous n'avez pas à vous soucier de leur récupération en général. Lorsqu'elles sont nécessaires à votre programme, datatables de base les rendront disponibles.

    À la fin de la journée, il offre une fonctionnalité similaire mais sous le capot c'est différent. Cela request une reflection différente car le SQL ordinaire n'a pas de sens dans le context des données de base car le SQL (dans le cas d'un magasin sqlite) est géré pour vous.

    Les principaux ajustements que j'ai apportés à la transition vers datatables de base ont été les suivants: se débarrasser du concept des identificateurs uniques. Ils vont dans les coulisses mais vous n'avez jamais à vous soucier d'eux et ne devriez pas essayer de définir les vôtres. Le deuxième ajustement pour moi était que chaque fois que vous avez besoin d'un object qui est lié au vôtre, vous le saisissez simplement en utilisant le (s) point (s) approprié (s) dans l'object d'entité que vous avez déjà.