Допустим, у меня есть база данных MySQL с 3 таблицами:
Таблица 1: Персоны, с 1 столбцом ID (int)
Таблица 2: Информационные бюллетени с идентификатором 1 столбца (int)
Таблица 3: Подписки, со столбцами Person_ID (int), Newsletter_ID (int), Subscribeed (bool), Обновлено (Datetime)
Subscription.Person_ID указывает на Персона, а Subscription.Newsletter_ID указывает на Информационный бюллетень. Таким образом, каждый человек может иметь 0 или более подписок на 0 или более журналов одновременно. В таблице «Подписки» также будет храниться вся история подписок каждого человека на каждую рассылку. Если у конкретной пары Person_ID-Newsletter_ID нет строки в таблице подписок, то это эквивалентно тому, что у этой пары статус подписки равен «false».
Вот пример набора данных
Persons
ID
1
2
3
Newsletters
ID
1
2
3
Subscriptions
Person_ID Newsletter_ID Subscribed Updated
2 1 true 2010-05-01
3 1 true 2010-05-01
3 2 true 2010-05-10
3 1 false 2010-05-15
Таким образом, по состоянию на 2010-05-16 гг. Лицо 1 не имеет подписки, Лицо 2 имеет подписку на Новостную рассылку 1, а Лицо 3 имеет подписку на Новостную рассылку 2. Лицо 3 некоторое время подписывалось на Новостную рассылку 1, но не больше.
Я пытаюсь сделать 2 вида запросов.
Запрос, который показывает все активные подписки на момент запроса (мы можем предположить, что обновленных никогда не будет в будущем - таким образом, это означает возвращение записи с последним «обновленным» значением для каждого Person_ID-Newsletter_ID пару, если подписка имеет значение true (если последняя запись для пары Person_ID-Newsletter_ID имеет статус подписки false, то я не хочу, чтобы эта запись возвращалась)).
Запрос, который возвращает все активные подписки на конкретную рассылку - такая же квалификация, как в 1. в отношении записей со значением «false» в столбце «Подписка».
Я не использую SQL / базы данных достаточно часто, чтобы сказать, хорош ли этот дизайн, или если требуемые запросы SQL будут медленными для базы данных, скажем, с 1М записей в таблице подписок.
Я использовал инструмент построения визуальных запросов в Visual Studio 2010, но даже не могу получить запрос на возврат последней обновленной записи для каждой пары Person_ID-Newsletter_ID.
Можно ли придумать SQL-запросы, которые не включают использование подзапросов (предположительно, потому что они станут слишком медленными с большим набором данных)? Если нет, то было бы лучше иметь отдельную таблицу Subscription_History, и каждый раз, когда статус подписки для пары Person_ID-Newsletter-ID добавляется в подписки, любая существующая запись для этой пары перемещается в Subscription_History (таким образом, подписки). таблица содержит только последнее обновление статуса для любой пары Person_ID-Newsletter_ID)?
Я использую .net в Windows, так что будет проще (или то же самое, или сложнее) выполнять запросы такого типа с использованием Linq? Entity Framework?
Редактировать: вот что произойдет, если я использую этот запрос:
SELECT Person_ID, Newsletter_ID, Allocation, Updated, MAX(Updated) AS Expr1
FROM subscriptions
GROUP BY Person_ID, Newsletter_ID
Я получаю строки 2 и 4 из таблицы подписок, которые перепутаны (в строке 2 результатов, указанных ниже):
Person_ID Newsletter_ID Subscribed Updated Expr1
2 1 true 2010-05-01 2010-05-01
3 1 true 2010-05-01 2010-05-15
3 2 true 2010-05-10 2010-05-10
Спасибо!