Impedir datos principales de combinar entidades en una sola tabla

¿Hay alguna forma de decirle a Core Data que no ponga todas sus entidades en una sola tabla cuando todas ellas henetworkingan de una entidad base? Aquí hay un ejemplo: Tenemos un object "Entidad" y tenemos una "Persona" y "Producto" que henetworkingan de "Entidad". Los datos centrales crean una tabla ZENTITY con los campos combinados para "Entidad", "Persona" y "Producto". Lo que queremos es que los datos centrales creen dos tablas separadas, una para "Persona" y otra para "Producto".

¿Es esto posible? Nada en línea habla sobre esto …

Hice mediciones y el performance de CoreData está totalmente degradado cuando se usa inheritance en datos reales (~ 50000 objects, más de 20 classs, cada uno con ~ 5 relaciones, la mayoría de ellos a muchos). No uso CD para aplicaciones de juguetes con 1000 objects, es una gran aplicación y la penalización de performance no está justificada. Peor aún, la creación de objects pequeños lleva mucho espacio en memory y ssd debido a esta estúpida implementación.

La única solución real (NECESITO inheritance) es replace la tienda persistente sqlite pnetworkingeterminada con la implementación manual utilizando NSIncrementalStore desde iOS 5 y versiones posteriores. Sin embargo, la request de obtención de traducciones de SQL y las actualizaciones de models son realmente difíciles de implementar.

Y sí, sé que los datos centrales no son un SQL. Pero espero que funcione comparativamente rápido cuando se trata de muchos datos; de lo contrario sería estúpido usarlo en aplicaciones de mundo real.

De acuerdo con el artículo detallado de Florian Kugler , la solución es usar la inheritance en su código de model, pero no en su esquema:

Jerarquía de Entidades vs. Jerarquía de Clases

Los models de objects gestionados ofrecen la posibilidad de crear jerarquías de entidad, es decir, podemos especificar una entidad como la matriz de otra entidad. Esto puede sonar bien, por ejemplo, si nuestras entidades comparten algunos attributes comunes. En la práctica, sin embargo, rara vez es lo que desea hacer.

Lo que ocurre detrás de escena es que Core Data almacena todas las entidades con la misma entidad principal en la misma tabla. Esto crea rápidamente tablas con una gran cantidad de attributes, lo que ralentiza el performance. A menudo, el propósito de crear una jerarquía de entidad es únicamente crear una jerarquía de class, de modo que podamos poner el código compartido entre varias entidades en la class base. Sin embargo, hay una manera mucho mejor de lograr esto.

La jerarquía de entidad es independiente de la jerarquía de subclass NSManagedObject. O dicho de otra manera, no necesitamos tener una jerarquía dentro de nuestras entidades para crear una jerarquía de classs.

https://www.objc.io/issues/4-core-data/core-data-models-and-model-objects/

Parece que es una vieja pregunta, pero aún espero poder ayudar a otros que tienen el mismo problema.

Encontré una buena respuesta de esta URL: https://www.objc.io/issues/4-core-data/core-data-models-and-model-objects/#entity-hierarchy-vs-class-hierarchy .

Para evitar que la URL sea inválida en el futuro, publiqué aquí contenido importante:

Por ejemplo, tenemos autores y libros henetworkingados de BaseEntity. Lo que deberíamos hacer es diseñar entidades como deberían ser, sin usar inheritance.

Entity hierarchy Class hierarchy ---------------- --------------- Authors Books BaseEntity | | Authors Books 

El código debería ser así:

 @interface BaseEntity : NSManagedObject @property (nonatomic) int64_t identifier; @property (nonatomic, strong) NSDate *createdAt; @property (nonatomic, strong) NSDate *changedAt; @end @interface Author : BaseEntity // Author specific code... @end @interface Book : BaseEntity // Book specific code... @end 

Nada en línea habla sobre esto …

Eso es porque las tablas no tienen nada que ver con Core Data.

Core Data no es SQL. Las entidades no son tablas. Los objects no son filas. Las columnas no son attributes. Core Data es un sistema de gestión de charts de objects que puede o no persistir en el gráfico de objects y puede o no usar SQL muy detrás de escena para hacerlo. Tratar de pensar en Core Data en términos SQL hará que se malinterprete por completo los datos básicos y resulte en mucho dolor y time perdido.

En este caso, su intuición entrenada por SQL sobre cómo optimizar SQL hará que pierda mucho time. Si alcanzas tu punto máximo en tu tienda SQLite a medida que te desarrollas, estás utilizando Core Data incorrectamente. No es solo un contenedor de objects para SQL.

Fue una decisión de layout poner a todas las entidades con la misma inheritance en la misma tabla SQL cuando Core Data usa una tienda SQLite. Sin embargo, esto tiene poca relevancia funcional en la mayoría de los casos, ya que Core Data gestiona primero el gráfico de object y se preocupa poco por los detalles de la persistencia. Si tiene una gran cantidad de objects del mismo tree de inheritance de entidad, es posible que encuentre algún problema de performance en el extremo superior, por ejemplo, 20k +, pero de lo contrario no.

En cualquier caso, no se puede cambiar. Core Data oculta intencionalmente su implementación de SQL porque SQL es solo una opción de persistencia de muchos.

La optimization prematura es la fuente de todos los males. Crea la mejor manera lógica y luego testing. Solo si encuentra un caso marginal en las testings, debe preocuparse por los detalles de la tienda SQL.