J'ai une table qui contient des informations très basiques. Juste un titre et quelques champs de date. Il y a un champ appelé commentaires qui est varchar (4000) La plupart du temps, nous le laissons vide, mais quelques fois, vous entrerez une grande quantité de données ici. Est-ce vraiment une mauvaise conception? Ou est-ce juste légèrement inefficace?
Je suppose que la création d'une table séparée pour cette colonne serait préférable.
remarque: il s'agit du serveur SQL 2008
Pour des performances plus prévisibles (et pour éviter d'avoir une variation élevée des lignes par page), je préférerais stocker ces données dans une table associée - surtout si elles ne sont remplies qu'un petit pourcentage du temps, et surtout si elles ne sont récupérées que dans certaines des requêtes. Les lignes où cette valeur est NULL
contribuent à la surcharge d'espace, mais cela est minime. Plus important sera de savoir comment une page ne peut contenir que deux lignes et la page suivante peut contenir 500 lignes - cela peut vraiment avoir un impact sur les statistiques et vous feriez mieux de diviser cela afin qu'il soit stocké séparément et n'impacte pas toutes vos opérations sur la table de base.
Il prend un minimum d'espace lorsqu'il n'est pas utilisé
Les frais généraux sont minimes et l'optimisation sera prématurée.
Jusqu'à ce que vous sachiez que vous avez un problème, conservez-le dans une seule table. Vous cassez KISS en introduisant des jointures externes et en ajoutant une surcharge lors de l'interrogation des données.
Je pense qu'un tableau séparé serait préférable pour améliorer la densité des pages et réduire la fragmentation, surtout si vous ne remplissez pas toujours ce champ.
Toutes ces pages vides et pointeurs conduisent à de mauvaises performances. Normalisez ce champ si vous le pouvez.
Cette question est très similaire: les colonnes vides supplémentaires affectent-elles la taille de la table SQL de manière significative?
Il semble que la réponse soit oui, cela prend de la place, mais il existe un algorithme de compression pour les colonnes avec beaucoup de valeurs nulles.
En ce qui concerne le design, je pense qu'avoir une table externe liée à cela serait un design plus propre. Avoir une colonne avec des valeurs nulles fréquentes rend plus difficile pour les utilisateurs de la base de données car ils pourraient accidentellement utiliser une valeur nulle s'ils ne font pas attention. Par conséquent, le code utilisant la base de données devrait contenir une vérification des erreurs et il devient simplement laid à partir de là.
Tout ira bien - c'est déjà une colonne varchar, donc elle n'utilise de l'espace que lorsqu'elle contient des données. Si vous aviez beaucoup de colonnes de taille fixe nullable comme int, vous pourriez avoir des problèmes d'utilisation de l'espace.
En ce qui concerne le mettre dans une autre table, je ne me dérangerais pas. Vous pouvez également envisager d'utiliser varchar (max) et les options d'entrée/sortie de ligne. Encore une fois, probablement prématuré.