web-dev-qa-db-fra.com

Une relation individuelle est-elle normalisée?

Considérer que nous avons un grand ensemble de données statistiques pour un enregistrement; par exemple. 20-30 INT colonnes. Est-il préférable de conserver l'ensemble de l'ensemble dans une table car ils appartiennent tous à un enregistrement OR Création d'une autre table connectée à une relation individuelle.

L'avantage du premier est d'éviter JOIN et d'avoir un accès rapide à toutes les données statistiques pour l'enregistrement correspondant.

L'avantage de ce dernier est de garder la colonne bien rangée. La première colonne est lue-intensive et la deuxième intensive d'écriture. Bien sûr, je pense que cela n'a aucun effet significatif sur la performance, car j'utilise InnoDB avec blocage au niveau des lignes.

En général, je veux savoir s'il est pratique utile de séparer différents ensembles de données pour un seul enregistrement?

12
Googlebot

Si elle convient dans les règles de la normalisation, les relations 1: 1 peuvent être normalisées (par définition!) - En d'autres termes, il n'y a rien d'environ 1: 1 que les relations qui leur rendent impossible à obéir aux formes normales.

Pour répondre à votre question sur la praticité des relations 1: 1, il y a des moments où il s'agit d'une construction parfaitement utile, telle que lorsque vous avez des sous-types avec des prédicats distincts (colonnes).

Les raisons pour lesquelles vous utiliseriez 1: 1 dépendent de votre point de vue. Les dabs ont tendance à penser à tout comme une décision de performance. Les modélisateurs de données et les programmeurs ont tendance à penser à ces décisions comme étant orientés de conception ou de modèle. En fait, il y a beaucoup de chevauchement entre ces points de vue. Cela dépend de vos perspectives et vos priorités. Voici quelques exemples de motivations pour 1: 1 Relations:

  • Vous avez un sous-ensemble de colonnes très vastes et vous souhaitez les séparer physiquement dans votre stockage pour des raisons de performance.

  • Vous avez un sous-ensemble de colonnes qui ne sont pas lues ni mises à jour fréquemment et que vous souhaitez les séparer des colonnes fréquemment utilisées pour des raisons de performance.

  • Vous avez des colonnes facultatives en général mais elles sont obligatoires lorsque vous savez que l'enregistrement est d'un certain type.

  • Vous avez des colonnes qui appartiennent logiquement pour un sous-type et que vous souhaitez les modéliser pour bien s'adapter au modèle d'objet de votre code.

  • Vous avez des colonnes qui ne peuvent s'appliquer que sur certains sous-types d'une entité super-type, et vous souhaitez que votre schéma applique l'absence de ces données pour d'autres sous-types.

  • Vous avez des colonnes appartenant à une entité, mais vous devez protéger ces colonnes en utilisant des règles d'accès plus restrictives (par exemple salaire sur une table d'employé).

Vous pouvez donc voir, parfois le conducteur est une performance, il s'agit parfois de la pureté modèle, ou d'un désir de tirer pleinement parti des règles de schéma déclaratif.

19
Joel Brown

Les principales raisons pour lesquelles vous utiliseriez une mappage unique pour casser une grande table en deux sont pour des raisons de performance, par exemple:

a) La table présente des données binaires/clob/blob dans une table fréquemment accessible, ralentissement de la performance en baisse car les grandes colonnes sont traitées différemment.

b) La table a de nombreuses colonnes accessibles par différentes requêtes, par conséquent, la performance est donc dégradée, vous déplaceriez donc des colonnes connexes dans un tableau séparé pour améliorer les performances d'accès.

Cependant, avoir de nombreuses colonnes entier ne justifient pas les efforts supplémentaires de briser la table en tables distinctes et à les interroger.