Когда * не * использовать основной тип данных Transformable? - PullRequest
13 голосов
/ 22 июля 2011

Я понимаю, что использование Transformable типа данных - это простой способ хранения массива или любого пользовательского объекта в Core Data.Я хотел бы знать, когда нужно не использовать Transformable, но вместо этого следует создать другую сущность и использовать отношение To-many.

Скажите, если это массив строк, есть ли максимальное числоэлементов или максимальная длина строки, которая может вызвать значительные проблемы с производительностью?

Ответы [ 2 ]

15 голосов
/ 22 июля 2011

Я хотел бы знать, когда не следует использовать Transformable, но вместо этого следует создать другую сущность и использовать отношение To-many.

Вы должны использовать трансформируемые атрибуты только тогда, когда вам абсолютно необходимо,Это не удобство или кратчайший путь, а необходимость в некоторых ресурсах.

Вы редко используете Базовые Данные для хранения структур данных, таких как массивы или словари, потому что Базовые Данные в основном используются не для хранения / постоянного хранения.а скорее для моделирования / симуляции.Для моделирования данных бесполезно превращать структуру данных в большой, не требующий логики блог данных.

Преобразуемые атрибуты обычно используются для хранения некоторого класса, который сам активно управляет данными, которые он хранит, например, для преобразования UIImage, чтобы вы могли получить UIImage прямо из хранилища UI и вернуть его обратно целиком.

В ответ на ваш главный вопрос:

Мне более интересно узнать, насколько большими могут быть данные, пока они не повлияют на производительность, и лучше их нормализовать.

Это зависит в основном от комбинации размера и сложности.Всякий раз, когда вы преобразуете кучу существующих объектов в большой двоичный объект, вам необходимо преобразовать весь блог.Таким образом, если вы сохраняете массив 1 Мб путем преобразования, вы получаете массив 1 Мб обратно в память при запуске обратного преобразования.Каждое преобразование, независимо от того, насколько оно мало, требует больше времени на обработку, чем доступ к обычному атрибуту или даже поиск другого управляемого объекта.Следовательно, наличие большого количества небольших преобразований, к которым часто обращаются, также приведет к значительному снижению производительности.

Лучше всегда лучше разложить большие куски данных на сущности, атрибуты и отношения.Это дает вам всю гибкость и оптимизацию Core Data бесплатно.Я использую Core Data вместо массивов и словарей, потому что как только вы по-настоящему обернетесь вокруг Core Data, его будет проще использовать.

Я бы никогда не использовал Core Data для хранения преобразованного массива строк или чего-либо подобного.Если в строках нет логики, а их всего несколько десятков, вы можете записать массив в файл plist.Это будет быстрее и проще, чем возиться с трансформируемым атрибутом.

9 голосов
/ 22 июля 2011

Это действительно сводится к тому, как вы хотите использовать данные, описываемые трансформируемым атрибутом.

Core Data создаст столбец BLOB-объектов в вашей базе данных SQLite под капотом, поэтому практически невозможно будет выполнить какой-либо реальный поиск или сортировку по атрибуту.

Обратное описание данныхВы хотите хранить с логической сущностью (через отношение ко-многим), что позволит вам использовать функции поиска и сортировки.

У сущности есть еще одно ключевое преимущество, заключающееся в том, что она может быть загружена лениво, странсформируемый атрибут вашего приложения будет потреблять стоимость загрузки этих данных каждый раз, когда объект выходит из строя.Если вы кодируете набор объектов в качестве преобразуемого атрибута, это может привести к значительному снижению производительности при подготовке данных с диска, даже если вам это не нужно.

Что касается размера,Вы можете хранить столько данных, сколько пожелаете в BLOB-объекте, это не ограничено.Это опять-таки сводится к влиянию производительности такого дизайна, где (особенно на устройствах iOS) ввод-вывод очень дорогой и ограничена память, ваше приложение может просто не в состоянии считывать данные из хранилища и в память (людипробовал вставлять фильмы в магазины CoreData SQLite).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...