Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Conception de relations 1:1 et 1:m dans SQL Server

Toute relation nécessite que la table "parente" (d'un côté) ait une clé primaire (ou unique) (PK), qui identifie de manière unique chaque ligne, et que la table "enfant" (de l'autre côté) ait une ou plusieurs colonnes de clé étrangère , qui doit contenir des valeurs identiques à certaines valeurs existantes de la clé primaire dans la table parent. Si vous voulez une relation un à plusieurs (1-M), la clé étrangère doit être un attribut ordinaire (colonne ou colonnes) dans la table enfant qui peut se répéter (il peut y avoir plusieurs lignes avec la même valeur)

Si vous voulez une relation un à un (1-1), la clé étrangère doit elle-même être une clé primaire ou un index unique dans la table enfant qui garantit qu'il peut y avoir au plus une ligne dans la table enfant avec cette valeur.

Une relation 1-1 partitionne efficacement les attributs (colonnes) d'une table en deux tables. C'est ce qu'on appelle la segmentation verticale. Ceci est souvent fait pour le sous-classement les entités de la table ou, pour une autre raison, si les modèles d'utilisation des colonnes de la table indiquent que certaines colonnes doivent être consultées beaucoup plus souvent que le reste des colonnes. (Disons qu'une ou deux colonnes seront consultées des milliers de fois par seconde et les 40 autres colonnes ne seront consultées qu'une fois par mois). Le partitionnement de la table de cette manière optimisera en fait le modèle de stockage pour ces deux requêtes différentes.

Sous-classe . Ce qui précède crée en fait une relation 1 à zéro ou un, qui est utilisée pour ce qu'on appelle une relation de sous-classe ou de sous-type. Cela se produit lorsque vous avez deux entités différentes qui partagent un grand nombre d'attributs, mais que l'une des entités possède des attributs supplémentaires dont l'autre n'a pas besoin. Un bon exemple pourrait être Employés , et Employés Salariés . L'Employé table aurait tous les attributs que tous les employés partagent, et le SalariedEmployee existerait dans une relation (1-0/1) avec Employés, avec les attributs supplémentaires (Salaire , Vacances Annuelles , etc.) dont seuls les salariés ont besoin.

Si vous voulez vraiment une relation 1-1, vous devez ajouter un autre mécanisme pour garantir que la table enfant aura toujours un enregistrement pour chaque enregistrement/ligne de la table parent. Généralement, la seule façon de le faire est de l'appliquer dans le code utilisé pour insérer des données (soit dans un déclencheur, une procédure stockée ou un code en dehors de la base de données). En effet, si vous avez ajouté des contraintes d'intégrité référentielle sur deux tables qui nécessitent que les lignes soient toujours dans les deux, il ne serait pas possible d'ajouter une ligne à l'une sans violer l'une des contraintes, et vous ne pouvez pas ajouter une ligne aux deux tables en même temps.