2012-03-05 4 views
1

Я пишу веб-приложение для пользователей, которым необходимо иметь возможность получать уведомления от администраторов при входе в систему. Эти уведомления должны отображаться на панели управления.Схема для системы уведомлений для пользователей

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

У меня две проблемы с проектирования схемы:

  1. Как определить, что пользователь «уволен» сообщение?
  2. Как новые пользователи видят только сообщения после их создания?

Вот таблица для уведомлений:

CREATE TABLE [dbo].[Notification] 
(
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [Message] [varchar](max) NOT NULL, 
    [DateCreated] [datetime] NOT NULL, 
    [CreatedById] [int] NOT NULL 
) 

Для # 1, я думал о создании таблицы (DismissedNotification_User), что бы сопоставить между Notification.Id и User.Id. Если существует пара, пользователь отклоняет это уведомление. Однако я не уверен, что это лучший подход (not in vs a left join)?

Для # 2, самый простой подход, который я вижу, добавляет столбец DateCreated пользователям и при добавлении условия на # 1 (where [DateCreated] >= [User].DateCreated).

Я не хочу использовать куки, потому что это действительно добавляет лишнего веса в приложение.

ответ

1

Я бы сказал, что ваши собственные решения для # 1 и # 2 здесь кажутся прекрасными.

Таблица ссылок для представления уведомления об увольнении имеет смысл, в противном случае вам придется создать одну строку для каждого пользователя спереди, чтобы представлять уведомление, а не одну запись уведомления.

Я также думаю, что для № 2, созданной даты для уведомления, и пользователь будет разумным вариантом. Другие предложения по использованию столбца «уволенный» не позволят вам отображать только уведомление ПОСЛЕ того, как пользователь был создан, если вы зависите от опции связанной таблицы, так как в конечном итоге вы получите все уведомления, а не только те, существовала.

+0

Спасибо - я собираюсь придерживаться своего первоначального плана. – TheCloudlessSky

+0

Я думаю, что это самый разумный вариант, в последнее время я сделал что-то подобное с системой оповещений. Я предполагал вставить строку для каждого пользователя и удалить их, но поскольку у нас есть пользователи 2-3k, и оповещения, вероятно, имеют отношение только к 10-20 пользователям за раз, казалось бы, неэффективно добавлять тысячи строк, которые никогда не будут затронуты. – dougajmcdonald

0
  • Для # 1: Добавить новый столбец в Notification таблицы что-то вроде dismissed или readed типа bit т.е. boolean данных со значением по умолчанию 0 или ложно, то в вашем приложении, когда пользователь откроет сообщение , обновите значение dismissed до 1, я увидел другие системы, которые добавляют кнопку Mark как прочитанную так, чтобы убедиться, что пользователь ее прочитал.

  • Для # 2: Вы можете использовать это поле dismissed, чтобы показывать только те сообщения, которые еще не освобождаемые для пользователей, поскольку они не были opended и прочитанного пользователем.

Так таблица уведомлений будет выглядеть примерно так:

[Notification] 
(
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [Message] [varchar](max) NOT NULL, 
    [DateCreated] [datetime] NOT NULL, 
    [CreatedById] [int] NOT NULL, 
    [Readed] bit Default(0) 
) 

Вам потребуется дополнительная таблица для хранения уведомлений для каждого пользователя, как,

dbo.UserNotifications 
(
    UserId, NotificationId 
) 

В приложении, когда пользовательский вход в систему проверяет наличие уведомлений с помощью readed = 0.

0

Вы можете присоединиться к этим двум задачам, создав таблицу, содержащую как пользователя, так и сообщение. Когда администратор отправляет сообщение, вы создаете запись для каждого существующего (активного?) Пользователя. Если вам не нужна история, вы можете удалить сообщение после того, как пользователь отклонил уведомление; в противном случае вы должны добавить столбец «Уволен». Таким образом, вам не нужны сложные запросы для получения уведомлений, которые вам нужно предоставить пользователю.

Смежные вопросы