Я согласен, что здесь может быть ошибка. Я изменил реализацию метода добавления объекта> для правильного добавления к NSMutableOrderedSet.
- (void)addSubitemsObject:(SubItem *)value { NSMutableOrderedSet* tempSet = [NSMutableOrderedSet orderedSetWithOrderedSet:self.subitems]; [tempSet addObject:value]; self.subitems = tempSet; }
Переназначение набора для self.subitems обеспечит отправку уведомлений Will / DidChangeValue>.
Лилль, вы уверены, что после такой пользовательской настройки значения NSMutableOrderedSet, сохраненные в этом наборе, будут корректно сохранены в базе данных CoreData? Я не проверял это, но похоже, что CoreData ничего не знает о NSOrderedSet и ожидает, что NSSet будет контейнером отношений со многими.
Не верьте, если кто-то скажет вам, что TINYTEXT хранится не так, как VARCHAR.
На самом деле, разница в следующем:
TINYTEXT и другие поля TEXT хранятся отдельно от строки в памяти внутри кучи MySQL, в то время как VARCHAR() поля добавляют до 64k лимит (так что вы можете иметь более 64k в TINYTEXT, в то время как с VARCHAR вы не будете иметь более 64k лимит).
TINYTEXT и другие 'blob-подобные' поля заставят SQL слой (MySQL) использовать временные таблицы на диске каждый раз, когда они используются, в то время как VARCHAR будет все еще отсортирован 'в памяти' (хотя будет преобразован в CHAR для всей ширины).
InnoDB внутренне не заботится о том, крошечный ли это текст или варчар. Это очень легко проверить, создать две таблицы, одну с VARCHAR(255), другую с TINYINT, и вставить запись в обе. Обе они возьмут одну 16k страницу - в то время как при переполнении страниц таблица TINYTEXT должна отображаться как минимум 32k в 'SHOW TABLE STATUS'.
Обычно я предпочитаю VARCHAR(255) - они не вызывают слишком большой фрагментации кучи для одной строки и могут быть обработаны как один 64k объект в памяти внутри MySQL. На InnoDB различия в размере ничтожно малы.
Я ожидал, что varchar будет быстрее, чем tinytext, и из моего поиска в Google вокруг этого, кажется, есть общий консенсус. Конечно, чтобы убедиться в этом, вам придется протестировать свою систему.
Причина, по которой это быстрее, в том, что когда MySQL выполняет определенные виды операций (соединения, сортировки и т. Д.), Он часто создает временные таблицы. Когда у вас есть тип BLOB (например, tinytext) во временной таблице, таблица будет основана на диске, а не в памяти, что, конечно, повлияет на производительность.
Вы также можете использовать char (255)
- хотя он использует больше места, он был значительно быстрее (по моему опыту) использовать поле это постоянный размер при дальнейшем сравнении. Дополнительное пространство можно заполнить заполнением, если вам нужна только скорость, а затем игнорировать пробелы позже.
Однако обратите внимание: MySQL не разрешает типы varchar
и char
существовать в одной таблице. Также он [обычно] не позволяет сравнивать varchar
и char
. Я обнаружил это в прошлом году, когда делал реализацию таблицы для хобби проекта .
CHAR / VARCHAR будет быстрее, так как эти столбцы хранятся на той же странице, что и данные основной строки *, тогда как типы TEXT хранятся за пределами страницы (я ошибался, см. Комментарий Харрисона).
Раньше люди часто использовали tinytext, потому что varchar (раздражающе) обрезал конечные пробелы. Это поведение было удалено в MySQL 5.0.
(* По крайней мере, для первых 768 байт и со встроенным InnoDB, а не с новым плагином InnoDB).