Я не вижу проблемы с простым решением: Таблица для объектов, таблица для тегов, кросс-таблица для "меток"
Индексы на кросс-таблице должны быть достаточной оптимизацией. Выбор соответствующих объектов был бы
SELECT * FROM items WHERE id IN
(SELECT DISTINCT item_id FROM item_tag WHERE
tag_id = tag1 OR tag_id = tag2 OR ...)
, И метки будут
SELECT * FROM items WHERE
EXISTS (SELECT 1 FROM item_tag WHERE id = item_id AND tag_id = tag1)
AND EXISTS (SELECT 1 FROM item_tag WHERE id = item_id AND tag_id = tag2)
AND ...
, который является по общему признанию, не настолько эффективен для большого количества сравнения тегов. Если необходимо поддержать количество тега в памяти, Вы могли бы сделать запрос для запуска с тегов, которые являются не часто, таким образом, И последовательность был бы оценен более быстрый. В зависимости от ожидаемого количества тегов, которые будут согласованы против и предвкушение соответствия любому синглу их, это могло быть решением для OK, если необходимо соответствовать 20 тегам и ожидать, что некоторый случайный объект будет соответствовать 15 из них, тогда это все еще было бы тяжело на базе данных.
Не тестировалось, поэтому может быть синтаксическая ошибка, но вы поймете идею.
NSArray* inputArray = [NSArray arrayWithObjects:@"dog", @"cat", @"fat dog", @"thing", @"another thing", @"heck here's another thing", nil];
NSMutableArray* containsAnother = [NSMutableArray array];
NSMutableArray* doesntContainAnother = [NSMutableArray array];
for (NSString* item in inputArray)
{
if ([item rangeOfString:@"another"].location != NSNotFound)
[containsAnother addObject:item];
else
[doesntContainAnother addObject:item];
}
Если известно, что строки внутри массива различны, вы можете использовать наборы. NSSet быстрее NSArray на больших входных данных:
NSArray * inputArray = [NSMutableArray arrayWithObjects:@"one", @"two", @"one again", nil];
NSMutableSet * matches = [NSMutableSet setWithArray:inputArray];
[matches filterUsingPredicate:[NSPredicate predicateWithFormat:@"SELF contains[c] 'one'"]];
NSMutableSet * notmatches = [NSMutableSet setWithArray:inputArray];
[notmatches minusSet:matches];