I'll asume you have a table called Alert, which holds the difinition of the different available alerts (ID, Name, Category, Desc..etc).
Then you might have another table called UserAlert, which might contain the following (UserID, AlertID, AlertName, AlertCategory, AlertDesc...).
Now I can think of the following 2 approaches (personally I prefer the second approach)
Approach #1:
1- When a user register to an Alert, you should create a row in the UserAlert table and copy all the chosen Alert values into the corresponding fields in the newly created row.
2- When the user wants to modify default values, you will change them in the UserAert table
3- To view user alerts, always select from the UserAlert table
Pros: Easier on viewing the user alerts
Cons: harder on maintaining default values
if the default values of an alert gets changed, you should check and see which UserAlert rows still has those default values (similar to those in the Alerts table), and then change them all in the same transaction.
Approach #2:
1- Create an extra field in the UserAlerts, let's call it "UseDefaults", and it's default value is true (1). Which determines if the user is using the default values or if he's using his own modified values
2- Create a database view to get the User defaults that you want, which might look like the following:
Select * -- have the fields Aliased
From UserAlerts
Where UseDefaults = 1
Union
Select * -- Select the Alerts fields and have them Aliased to match the above query
From UserAlerts Inner join Alerts
Where UseDefaults = 0
3- Map the view to an Entity or TypedView
Pros: Easier to maintain, less code
Cons: harder on design time, carefull dealing with the "UserDefaults" flag is needed.