Comment Créer un véritable one-to-one relation dans SQL Server
J'ai deux tables tableA
et tableB
, j'ai mis tableB
's de la clé primaire comme clé étrangère qui référence tableA
principal. Mais quand j'utilise Entity Framework de base de données tout d'abord, le modèle est de 1 à 0..1.
Comment créer un one-to-one relation dans SQL Server?
- Dans la pratique. Qui a besoin d'un "vrai" one-to-one relation? une relation de type 1 à 0..1 est Ok et plus de naturel et pratique. C'est comme l'ajout d'une colonne nullable à une table existante. Il suffit de faire une clé étrangère unique.
Vous devez vous connecter pour publier un commentaire.
Je suis sûr que c'est techniquement impossible dans SQL Server pour avoir un Vrai 1 pour 1 relation, cela signifierait que vous auriez ont pour insérer des enregistrements dans le même temps (sinon, vous obtiendrez une erreur de contrainte lors de l'insertion), dans les deux tables, avec deux tables ayant une relation de clé étrangère les uns des autres.
Cela étant dit, votre conception de base de données décrit avec une clé étrangère est un 1 à 0..1 relation. Il n'est pas possible de contraindre qui nécessiterait un enregistrement dans la tableB. Vous pouvez avoir une pseudo-relation avec un déclencheur qui crée l'enregistrement dans la tableB.
Il y a donc quelques pseudo-solutions
Tout d'abord, le stockage de toutes les données dans une table unique. Ensuite, vous n'aurez pas de problèmes en EF.
Ou, Deuxièmement, votre entité doit être assez intelligent pour ne pas permettre une insertion, sauf s'il est associé à un dossier.
Ou, troisièmement, et le plus probable, vous avez un problème que vous essayez de résoudre, et vous nous demandez pourquoi votre solution ne fonctionne pas de la place du vrai problème que vous essayez de résoudre (XY Problème).
Mise à JOUR
À expliquer dans RÉALITÉ comment 1 à 1 les relations ne sont pas de travail, je vais utiliser l'analogie de la Poule ou de l'oeuf dilemme. Je n'ai pas l'intention de résoudre ce dilemme, mais si vous avez une contrainte qui dit afin d'ajouter un Œuf à l'Œuf de la table, la relation de la poule doit exister, et que le poulet doit exister dans la table, alors vous ne pouvez pas ajouter un Œuf à l'Œuf de la table. L'inverse est également vrai. Vous ne pouvez pas ajouter le Poulet et le Poulet de la table sans la relation à l'œuf et l'Œuf existant dans les Œufs de table. Donc pas de dossiers, qui peuvent être tout fait, dans une base de données sans rupture de l'une des règles/contraintes.
Base de données nomenclature d'un one-to-one relation est trompeuse. Toutes les relations que j'ai vu (donc mon expérience) serait plus descriptif que l'un-à-(zéro ou un) relations.
Définir la clé étrangère comme clé primaire, puis définissez la relation sur les deux champs de clé primaire. Ça y est! Vous devriez voir une touche de signe sur les deux extrémités de la ligne de relation. Cela représente un à un.
Vérifier : SQL Server Base de données de Conception avec une Relation
constraint PK_user1 primary key (user_pers_id), constraint FK_user1 foreign key (user_pers_id) references person(pers_id)
CONSTRAINT UQ_user__user_pers_id UNIQUE (user_pers_id)
&CONSTRAINT FK_user__user_pers_id REFERENCES person(pers_id)
doit être fonctionnellement égal àCONSTRAINT PK_user__user_pers_id PRIMARY KEY (user_pers_id)
&CONSTRAINT FK_user__user_pers_id REFERENCES person(pers_id)
.Cela peut être fait par la création d'une simple primaire clé étrangère de la relation et le réglage de la colonne de clé étrangère à l'unique de la manière suivante:
Vérifier pour voir si tout va bien
Maintenant Généralement dans le Primaire Étrangères Relation (Un à plusieurs),
vous pouvez entrer plusieurs fois
EmployeeID
,mais ici, une erreur sera levée
La déclaration ci-dessus va afficher le message d'erreur que
Il ya une façon que je sais comment réaliser un effet strictement* one-to-one relation sans l'aide de déclencheurs, des colonnes calculées, des tableaux supplémentaires, ou d'autres "exotique" de tours (seulement les clés étrangères et les contraintes unique), avec une petite mise en garde.
Je vais emprunter le poulet et les œufs de la notion de la accepté de répondre pour m'aider à expliquer la mise en garde.
Il est un fait que ce soit un poulet ou un oeuf doit venir en premier à la DBs courant de toute façon). Heureusement, cette solution ne permet pas d'obtenir de politique et de ne pas prescrire ce qui doit venir en premier - il laisse le maître d'œuvre.
Le problème, c'est que la table qui permet un enregistrement de "venir en premier' techniquement, peuvent avoir un dossier créé sans l'enregistrement correspondant dans l'autre table; cependant, dans cette solution, un seul enregistrement est autorisé. Lorsqu'un enregistrement est créé (uniquement du poulet ou des oeufs), pas plus que les enregistrements puissent être ajouté à l'une des deux tables jusqu'à ce que le 'seul' enregistrement est supprimé ou un enregistrement correspondant est créé dans l'autre table.
Solution:
Ajouter des clés étrangères pour chaque table, la référence à l'autre, d'ajouter des contraintes uniques pour chaque clé étrangère, et d'en faire une clé étrangère nullable, l'autre pas les valeurs null et aussi une clé primaire. Pour que cela fonctionne, l'unique contraindre sur la colonne nullable ne doit permettre qu'un nul (c'est le cas dans SQL Server, vous ne savez pas sur d'autres bases de données).
À insérer, d'abord un œuf doit être inséré (avec la valeur null pour le Poulet). Aujourd'hui, le poulet peut être inséré et il doit faire référence à la "non réclamé" l'oeuf. Enfin, l'ajout d'œuf peuvent être mis à jour et il doit faire référence à la "non réclamé" le poulet. En aucun point, deux poulets être fait référence à la même œuf ou vice-versa.
À supprimer, la même logique peut être suivi: mise à jour des œufs de Poulet à la valeur null, supprimer le nouveau "non réclamé" de poulet, de supprimer l'œuf.
Cette solution permet également de permutation facilement. Fait intéressant, l'échange pourrait être l'argument le plus fort pour l'utilisation d'une telle solution, car il a un potentiel d'utilisation pratique. Normalement, dans la plupart des cas, un one-to-one relation de deux tables est mieux mis en œuvre par simplement refactoring les deux tables en une seule; toutefois, dans un scénario possible, les deux tables peuvent représenter réellement des entités distinctes, qui exigent une stricte one-to-one relation, mais il faut souvent swap "partenaires" ou être réorganisés en général, tout en conservant le one-to-one relation après la ré-arrangement. Si la plus commune de la solution ont été utilisés, toutes les colonnes de données de l'une des entités devraient être mises à jour ou remplacées pour toutes les paires de re-arrangé, par opposition à cette solution, où une seule colonne de clés étrangères besoin d'être ré-arrangé (le nullable colonne de clé étrangère).
Bien, c'est le meilleur que j'ai pu faire à l'aide de la norme contraintes (ne pas juger 🙂 Peut-être que quelqu'un va trouver utile.
1 À 1 Relations dans SQL sont faites par la fusion du champ de la table dans une !
Je sais que vous pouvez diviser un Tableau en deux entité avec un 1 à 1 de rapport. La plupart du temps vous utilisez ce parce que vous voulez utiliser lazy loading sur "lourd champ de données binaires dans un tableau".
Exemple: Vous disposez d'une table contenant des images avec une colonne de nom (chaîne de caractères), peut-être certains de la colonne de métadonnées, une miniature de la colonne et de l'image elle-même varbinary(max). Dans votre application, vous aurez certainement s'affichent en premier, seulement le nom et la miniature dans un contrôle de collecte puis de charger le "tableau complet des données" seulement si nécessaire.
Si c'est ce que vous cherchez. C'est quelque chose appelée "table de fendage" ou "le découpage horizontal".
https://visualstudiomagazine.com/articles/2014/09/01/splitting-tables.aspx
La façon la plus simple d'y parvenir est de créer seulement 1 table avec Table et les champs B NON NULS. De cette façon, il est impossible d'avoir l'un sans l'autre.
Quoi à ce sujet ?