Разработка базовой модели данных - поиск по отношению к отношениям? - PullRequest
2 голосов
/ 20 января 2010

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

Представьте, что я создаю почтовое приложение, в котором электронная почта является основным объектом. Мне нужно предоставить несколько представлений в хранилище электронной почты: поиск по пользователю, а также по многим другим критериям: скажем, «все электронные письма с более чем двумя получателями», «все электронные письма, тема которых длиннее X», «все электронные письма, содержащие слово X» и т. д.

Некоторые объекты, такие как люди (отправители / получатели), естественным образом поддаются моделированию как первоклассные объекты, поэтому я мог бы сделать это и просто создать отношения «многие ко многим» между людьми и электронными письмами. Другие поиски, такие как некоторые примеры выше, являются более искусственными, и нет естественного способа их моделирования. Однако я могу заранее перечислить новые поиски, т.е. заранее знаю, каковы будут критерии.

Итак, для таких вещей, как «электронные письма с> 2 получателями» и «электронные письма, тема которых длиннее X», я думаю, у меня есть две стратегии:

1) смоделируйте их как специальный «поисковый» объект и создайте отношения «многие ко многим» между электронными письмами и объектами поиска при вставке новых объектов в хранилище, так что это простой запрос соединения при поиске;

2) не моделировать ничего, кроме основного объекта электронной почты, а просто выполнять поиск по предикатам из хранилища во время выполнения.

Мой вопрос:

На основании ваших инстинктов Core Data насколько велика разница между этими двумя стратегиями с точки зрения производительности? Моя интуиция говорит мне, что # 1 всегда будет быстрее, но если оно составляет 10%, я готов взять удар производительности, чтобы быть более гибким с # 2. Но если # 2 будет работать на 200% медленнее, мне нужно больше работать над моделированием поискового объекта и по существу предварительно сгенерировать все результаты поиска.

Я знаю, что точный ответ будет зависеть от специфики данных, но, должно быть, у вас возникло внутреннее чувство :) Допустим, существует порядка десятков тысяч, но не миллионов, объектов контента, и каждая запись несколько абзацев содержательного текста с несколькими полями метаданных.

1 Ответ

2 голосов
/ 20 января 2010

Как правило, я бы рекомендовал придерживаться второй стратегии и тратить время на исследование и разработку других методов, если вы действительно столкнулись с проблемами производительности во время тестирования. Базовые данные часто быстрее, чем люди думают, особенно на iPhone.

Однако, если вы сможете определить все возможные поиски заранее, это даст вам преимущество. Звучит так, как будто электронное письмо создано, вы бы проверили его и добавили ко всем соответствующим «поисковым» объектам. Мне кажется, что первая стратегия будет значительно быстрее, особенно для десятков тысяч объектов электронной почты.

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