2011-07-21 17 views
12

Entiendo que el uso del tipo de datos Transformable es una manera fácil de almacenar una matriz o cualquier objeto personalizado en Core Data. Me gustaría saber cuándo se debe usar no usar Transformable, sino que se debe crear otra entidad y usar la relación To-many.¿Cuándo * no * utiliza Core Data type Transformable?

decir si es una matriz de cadenas, es que hay un número máximo de elementos o longitud máxima de la cadena que podría causar problemas de rendimiento significativa?

+1

No uso el iPhone, pero trato con SQLite: mi decisión a menudo se reduce a * cómo * se usarán los datos. ¿Las relaciones (y las entidades individuales) son fundamentales para el uso o * los datos solo se producen/consumen como una sola unidad *? (En un entorno "no integrado" casi siempre defiendo exclusivamente el enfoque normalizado). –

+0

@pst La relación no es importante, los datos solo se usan como una sola unidad. Tengo más curiosidad sobre cuán grandes pueden ser los datos hasta que afecten el rendimiento y es mejor normalizarlos. – pixelfreak

Respuesta

15

Me gustaría saber cuándo no se debe usar Transformable, sino que se debe crear y utilizar la relación To-many.

Solo debe usar atributos transformables cuando sea absolutamente necesario. No son una conveniencia o un atajo, pero una necesidad de recursos intensivos en algunas circunstancias.

rara vez utiliza la base de datos para almacenar estructuras de datos como matrices o diccionarios porque Core de datos se utiliza principalmente para no para el almacenamiento/persistencia, sino más bien para el modelado/simulación. Es inútil para modelar datos para convertir una estructura de datos en un gran blog de datos sin lógica.

Los atributos transformables se suelen utilizar para almacenar una clase que gestiona activamente los datos que contiene, p. transformando un UIImage para que puedas tomar un UIImage directo de la tienda UI y recuperarlo todo en una sola pieza.

En respuesta a su pregunta principal:

Soy más curiosidad por lo grande que los datos pueden ser hasta que afecta rendimiento y que es mejor para normalizar ellos.

Depende principalmente de la combinación de tamaño y complejidad. Cada vez que transforma un grupo de objetos existentes en un blob de datos, debe leer todo el blog transformándolo. Por lo tanto, si almacena una matriz de 1mb por transformación, obtendrá una matriz de 1mb en la memoria cuando ejecute la transformación inversa.Cada transformación, por pequeña que sea, requiere más tiempo de procesamiento que el acceso a un atributo normal o incluso la búsqueda de otro objeto gestionado. Por lo tanto, tener una gran cantidad de pequeñas transformaciones a las que a menudo se accede también causará un gran golpe de rendimiento.

Es siempre mejor para descomponer grandes trozos de datos en entidades, atributos y relaciones. Al hacerlo, obtendrá toda la flexibilidad y optimizaciones de Core Data de forma gratuita. Me encuentro utilizando Core Data en lugar de matrices y diccionarios, porque una vez que realmente te das cuenta de los Core Data, es más fácil de usar.

Nunca usaría Core Data para almacenar una matriz transformada de cadenas o similar. Si las cadenas no tienen lógica y solo hay unas pocas docenas de ellas, también podría escribir la matriz en un archivo plist. Será más rápido y más fácil que jugar con un atributo transformable.

9

Realmente se reduce a la forma en que desea utilizar los datos descritos por el atributo transformable.

de Datos Básicos creará una columna BLOB en su base de datos SQLite bajo el capó, por lo que será casi imposible de hacer cualquier tipo de búsqueda de bienes o tipo de atributo.

describir el contrario los datos que desea almacenar con una entidad lógica (a través de una relación a muchos) le permitirá utilizar la funcionalidad de búsqueda y clasificación.

la entidad tiene otra ventaja clave que es que puede ser cargado con pereza, con un atributo transformable su aplicación va a comer el costo de la carga que los datos cada vez que las faltas de objeto. Si está codificando un conjunto de objetos como un atributo transformable, esto podría generar un importante problema de rendimiento a medida que prepara los datos del disco, incluso cuando no los necesite.

En lo que a tamaño se va, usted puede mantener todos los datos que se desea en la burbuja, que es ilimitada. Esto nuevamente se reduce a los impactos en el rendimiento de dicho diseño, donde (especialmente en dispositivos iOS) la E/S es muy costosa y la memoria limitada, su aplicación simplemente no puede leer los datos fuera de la tienda y en la memoria (personas he intentado pegar películas, en las tiendas CoreData SQLite).