2008-10-16 8 views
11

J'ai une application Web qui informe les utilisateurs de l'activité sur le site par courrier électronique. Les utilisateurs peuvent choisir les types de notifications qu'ils souhaitent recevoir. Jusqu'à présent, il existe environ 10 options différentes (chacune est vraie/fausse).Meilleure façon de stocker plusieurs indicateurs dans la base de données

Je stocke actuellement cela dans un champ varchar comme 0 ou 1 séparés par des virgules. Par exemple: 1,0,0,0,1,1,1,1,0,0

Cela fonctionne mais il est difficile d'ajouter de nouveaux indicateurs de notification et de garder la trace de l'indicateur correspondant à quelle notification. Existe-t-il une norme acceptée pour ce faire? Je pensais ajouter une autre table avec une colonne pour chaque type de notification. Ensuite, je peux ajouter de nouvelles colonnes si j'en ai besoin, mais je ne suis pas sûr de son efficacité.

Merci d'avance!

Répondre

20

J'utiliserais deux tables. Une table stocke les données utilisateur et l'autre les notifications auxquelles elles sont abonnées. La deuxième table ressemblerait à quelque chose comme ceci:

create table notifications (
    user_id int, 
    notification_type int 
); 

Je ferais une relation entre FK user_id et l'identifiant de l'utilisateur dans la table des utilisateurs avec une cascade sur supprimer. Utilisez à la fois le user_id et le type de notification comme clé primaire. Pour vérifier si un utilisateur souhaite une notification particulière, faites simplement une jointure entre les deux tables et sélectionnez des lignes où le type de notification correspond à celui en question. Si le jeu de résultats n'est pas vide, l'utilisateur veut la notification.

L'ajout de nouvelles notifications devient trivial (tout comme la suppression). Ajoutez simplement (supprimez) une nouvelle valeur de type et laissez les utilisateurs choisir de l'accepter ou non. Si vous vouliez garder les types de notification dans une table pour gérer via l'application qui fonctionnerait, aussi, mais ce serait un peu plus complexe.

+0

Cela semble la meilleure solution de loin IMO. Les stocker tous dans une colonne n'est pas très extensible. Et les stocker comme des champs bool dans une table signifie que vous devez ajouter un nouveau champ chaque fois qu'il y a un nouveau type de notification. – Craig

+0

Cela fonctionnerait bien, en particulier si vous voulez pouvoir scanner les types de notification. – BCS

+0

La normalisation est excellente pour l'extensibilité, mais elle souffre un peu des performances. – stephenbayer

0

Je m'attendrais à ce que laisser le DB le gérer en utilisant des colonnes Bool serait mieux. Il me semble me rappeler que certains systèmes compressent les booléens en bits (null peut gâcher ça). Pour éviter l'encombrement, vous pouvez en faire un tableau distinct.

(Je ne suis pas DBA)

Edit: gifles tête "Je viens suggère exactement ce que vous êtes chose": b

2

J'utiliser 10 différents bits ou champs booléens. Mais si vous allez le faire dans un champ, vous pouvez utiliser un bitmap 0x1111111111 comme un grand nombre entier ou un champ de texte sans la virgule. J'ai travaillé sur différentes applications, en utilisant toutes ces techniques. Mais je voudrais juste aller avec les champs multiples. Il sera beaucoup plus facile de faire des sélections sur.

0

Si vous avez décidé d'utiliser un champ de bits comme @stephenbayer mentionné, vous pouvez toujours utiliser une vue sur la table pour le rendre plus facile pour les développeurs d'utiliser ce qui signifie alors que vous avez encore les économies d'espace de le champ de bits et la facilité d'utilisation des colonnes séparées par champ et en évitant d'avoir à analyser la colonne

Comme mentionné précédemment, le tableau séparé est une excellente option si vous voulez que votre solution soit plus extensible.Le seul inconvénient est légèrement augmenté la complexité.

Ceci est le compromis. Si vous voulez quelque chose qui est vraiment facile à implémenter et qui considère rapidement le champ de bits. Si vous voulez quelque chose qui est plus facile à étendre et à maintenir au prix d'un peu plus de complexité, alors allez-y pour la table séparée. Si les votes vous disent quelque chose, vous voudrez probablement suivre l'implémentation de la table séparée.

Questions connexes