Я не совсем уверен, для чего предназначено поле «действие» в # 1, но если я правильно понимаю вашу потребность, вы, по сути, хотите, чтобы пользователи подписывались на очередь уведомлений, верно? Эти уведомления предназначены для отправки пользователю по электронной почте или отображаются только при входе в систему, или и то, и другое?
Я бы соблазнился действительно подумать об этом как об очереди, где вы «публикуете» уведомления, а пользователи «подписываются» на любое уведомление со своим идентификатором user_id, связанным с ним. В реляционной схеме вы, вероятно, захотите использовать что-то вроде # 1, где у вас есть уведомление с типом, связанным с пользователем. Индекс на user_id, конечно, чтобы убедиться, что вы можете получить их уведомления быстро. Если вы будете часто запрашивать это, кэширование всего, что вам нужно для целей отображения, имеет большой смысл, так что вам не нужно объединяться ни в какие другие таблицы - это предполагает, что данные отображения не могут измениться после уведомление отправлено.
Однако, если эти уведомления не нужно будет обновлять в режиме реального времени, пока пользователь находится на сайте (например, если они отображаются при входе в систему или доставляются по электронной почте), тогда вы можете запросить только один раз при входе в систему. и кешировать уведомления. Если вы будете постоянно запрашивать это в режиме реального времени, чтобы проверять наличие новых уведомлений, и у вас много пользователей, это может вызвать проблемы с ростом таблицы. Вы можете осквернить его, настроив отдельные таблицы для разных типов уведомлений, возможно, или разделив на user_id, но это только покажет вам.
Вам также необходимо убедиться, что вы подрезали стол. Возможно, вам понадобится добавить флаг, чтобы указать, что пользователь уже видел уведомление, но в идеале, когда он его увидит, вы можете удалить его, и это уменьшит размер таблицы.
Другой альтернативой является сохранение уведомлений вне ваших rdbms. Рассмотрите возможность хранения уведомлений в memcached, например, если допустима их потеря (например, если сервер отключается). Или посмотрите на Redis (http://code.google.com/p/redis/),, который очень легко решит эту проблему - сохраните уведомления и создайте набор для каждого пользователя, и вы почти закончили.
Просто некоторые мысли, надеюсь, они полезны.