web-dev-qa-db-fra.com

Quand utiliser le type de données XML

Je suis responsable de la création d'une base de données sur un projet. Nous avons des domaines qui vont rarement avoir une valeur (1 dans tous les 10 000 enregistrements) et j'essaie de déterminer la meilleure façon de stocker cela dans la base de données.

Pour autant que je puisse voir, j'ai 3 options:

  1. Ajouter une colonne dans le tableau pour chaque valeur supplémentaire
  2. Ajoutez une table liée qui fait référence à la table d'origine et comporte des enregistrements uniquement lorsque nous devons stocker une valeur.
  3. Utilisez le type de données XML dans la table d'origine et stockez toutes les valeurs de cette manière.

Y a-t-il d'autres options que je n'ai pas envisagées?

J'essaie de travailler sur les avantages et les inconvénients de chaque méthode. Pour autant que je puisse dire 1 serait le plus facile et 2 prendrait le moins d'espace mais je me débats pour trouver de nombreuses ressources pour 3.

12
Matthew Steeples

Cela ressemble à ce dont vous avez besoin est colonnes clairsemées et index filtrés et optez avec option 1. Celles-ci sont entièrement prises en charge et fonctionnalités documentées pour exactement ce scénario.

Le moteur de base de données SQL Server utilise le mot-clé clairsemé dans une définition de colonne pour optimiser le stockage des valeurs dans cette colonne. Par conséquent, lorsque la valeur de la colonne est null pour une ligne de la table, la valeur ne nécessite aucun stockage.

Je ne peux pas imaginer une solution XML performante dans ce scénario, elle aura une énorme surcharge de métadonnées redondantes et sera lente à interroger.

12
Gaius
  1. Une colonne nullable prend non Espace si la longueur variable dans SQL Server. Le fait d'être null est stocké dans le null bitmap . Vous pouvez l'indexer si nécessaire avec index filtrés Pour ignorer les colonnes Null.

  2. Ajoute la complexité lorsque vous considérez le point 1.

  3. Ne pas. Difficile à rechercher, parse, etc.: vous Will Regret plus tard

Cela dépend également de la taille: cela sera-t-il char (1000) pour quelques milliards de lignes? Ou Tinyint pour 100 000 lignes? Si ces derniers considèrent la complexité supplémentaire du point 2: ne valent pas la peine.

5
gbn

Avec SQL Server 2008, vous disposez d'une option supplémentaire d'utiliser des colonnes clairsemées, conçues spécifiquement pour la situation que vous avez mentionnée.

Ils ont l'avantage supplémentaire que vous pouvez les afficher en tant qu'objet XML combiné à l'aide de xml colonne_set ou de les référencez individuellement et fournit une épargne d'espace formidable.

Consultez l'article de blog suivant pour plus de détails: http://www.sqlskills.com/blogs/paul/post/sql-server-2008-sparse-columns-and-xml-column_set.aspx

3
Jeff