Я бы держал их в одном столе. В противном случае, (а) у вас есть две таблицы с одинаковыми столбцами. В любое время, когда вы вносите изменения в данные, вы должны помнить об одинаковом изменении обеих таблиц. Рано или поздно кто-то забудет - или получит блестящее представление о том, что данные в одной таблице не нужны в другой - и теперь ваш дизайн усложняется. Довольно скоро вы пишете одну и ту же логику дважды: один раз для извлечения из «текущей» таблицы и еще раз для извлечения из «архивной» таблицы. Но затем кто-то вносит изменения в один кусок кода и забывает внести то же самое изменение в другой кусок кода. Тогда следующий человек, который придет, не может быть уверен, что они разные, потому что есть веская причина, почему они должны отличаться или кто-то просто забыл. И т. Д. (B) Кажется вероятным, что у вас будут запросы, которые захотят попасть в обе таблицы, например «скажи мне все объявления с запрашиваемой ценой свыше 20 000 долларов за последние 12 месяцев», где некоторые из них могут быть текущими, а другие - текущими. архив. Эти запросы теперь являются объединениями или сложными объединениями, вместо того, чтобы просто не включать флаг «expired is true» или «expired is false».
Что касается проблемы производительности, это просто: создайте многопольный ключ, включающий все, что вам нужно включить. expired + цена или expired + modelname кажутся вероятными ключами. Вы, вероятно, хотите сначала указать истекший срок действия, потому что большинство ваших запросов, вероятно, будут нуждаться в записях с истекшим сроком, но я просто предполагаю. Выбор того, на что стоит индексировать, является сложным решением, но когда есть очевидные общие запросы к нескольким полям, просто сделайте это.