1. Прежде всего, расписание можно задавать естественным языком, или хранить в JSON придумав какой-нибудь DSL, - вне зависимости от базы данных. Превосходная библиотека для этого:
https://github.com/kvh/recurrent (хотя поддерживает только английский). Если вам нужно, например, делать рассылки, - вы пробегаете по всем активным расписаниям в цикле, проверяете, соответствует ли текущая дата расписанию, и выполняете действие.
2. Если такую выборку делать хочется очень быстро и средствами БД, тогда при вводе вышеупомянутого высокоуровневого расписания можно заполнять все даты в некоем кэше (или в отдельной таблице в БД), выставляя флаг для пары (дата, id расписания). При изменении расписания эта матрица для него перевычисляется.
3. Как быть с исключаемыми днями? Можно в каждом из объектов предлагать два поля: "Расписание" (например: every friday) и "Исключая" (например: 1 Jan - 10 Jan).