Un exemple d'un nécessaire à nullable clé étrangère?
Customers
customer_id
Orders
order_id
customer_id fk
Si j'ai deux tables et définir une clé étrangère sur customer_id dans la table Commandes, ce qui lui permet d'être nul, je dis que je peux avoir un ordre qui n'ont pas de client associé. En tant que telle, la notion de nullable clé étrangère semble en contradiction avec l'objectif d'une clé étrangère, qui est de faire respecter cette contrainte.
Est-il un simple exemple d'une situation dans laquelle un nullable clé étrangère serait nécessaire? Ou un argument en faveur de leur permettre?
Vous devez vous connecter pour publier un commentaire.
Imaginer une table qui contient les Tâches d'une équipe. Si une tâche n'est pas encore attribué à un membre de l'équipe,
user_id
estNULL
. Si elle n'est pasNULL
c'est une clé étrangère à lausers
table.UnassignedTask
table et unAssignedTask
table, ce dernier ayant un FK contrainte àUser
et ancien pas de.user_id
ne devrait pas être la clé primaire. Qui permettrait à chaque utilisateur à une seule tâche.task_id
devrait être la clé primaire (ce qui signifie que chaque tâche peut appartenir à plus d'un utilisateur), et les deux colonnes doivent avoir les clés étrangères pour leurs colonnes respectives de l'Utilisateur et de tables de travail.Non, nullable les clés étrangères ne sont jamais nécessaire.
Vous pouvez toujours normaliser une option 1-nombre de relation. Prendre votre exemple, vous pouvez avoir les tableaux suivants:
Les deux contraintes uniques assurez-vous qu'une commande ne peut appartenir qu'à un seul client, et de ne jamais le même client deux fois.
Si vous devriez toujours normaliser une telle relation est une autre histoire. Dans certains cas, la dénormalisation peut conduire à la simplification des implémentations.
Todo { todoId PK, … }
,UserHasTodo { todoId PK FK Todo(todoId), userId FK User(userId) }
.Le but d'une clé étrangère est de rendre explicite le concept de l'entier aléatoire dans la table Commandes, désigne en fait un élément dans la table Clients. En fait l'application de cette contrainte est accessoire.
Pour définir une clé étrangère nullable ou null utilisation ci-dessous le script sql
il est, faire une structure en arbre, un tableau dans lequel sont liés à elle-même. Considérez ceci:
Pour la racine, parent_node_id doit être null, droit?
NULL
, en est une excellente façon de le faire et j'ai conçu des tables de cette façon, moi, je ne voulais pas la faire sonner comme il n'était vraiment pas bon, juste que c'est pas obligatoire). La création d'un véritable nœud racine est également possible. L'ajout d'un-autre-pour-zéro-ou-une relation d'un tableau pour enregistrer le parent serait aussi travailler. Le point ultime est que leNULL
en mesure de clé étrangère est, autant que je peux dire, jamais obligatoire. Dans votre réponse, vous dites "si NULL" mais je suis en désaccord avec cela.Une commune conception de scénario pour la définition d'une colonne à la valeur null est si vous avez un "un à plusieurs" relation de parent-enfant, mais les enfants n'ont pas à être présents.
Lorsqu'un enregistrement parent (comme un compte) a des enfants qui peuvent être supprimés (comme des demandes d'aide) c'est une bonne utilisation.
Vous pouvez avoir une colonne pour MostRecentRequest qui inclut l'ID de la plus récente demande d'aide. Lorsque la demande est retirée du système de la MostRecentRequest colonne est NULL sens il n'y a aucun présent.
Un autre exemple est lorsque vous souhaitez NULL signifie qu'une ligne n'a pas été attribuée à un parent encore. Peut-être vous avez des demandes d'aide qui viennent et un NUL sur le technicien, cela signifie qu'aucune technologie est attribué à la demande. Lorsque vous supprimez que technicien, vous voulez tout son inachevée de travail pour aller à la piscine par la réinitialisation de la valeur NULL.
Il ya une autre situation que je peux penser:
Au sein d'une table, vous avez un champ ID qui identifie de manière unique l'album. Ce même dossier peut (ou peut ne pas) avoir un seul parent.
Tableau avec les colonnes suivantes:
Avec une contrainte de clé étrangère, vous pouvez vous assurer que si le champ n'est pas nul, il se réfère à une parente valide. En outre, si vous essayez de supprimer l'enregistrement parent sans corriger les enfants, les parents ne peuvent pas être supprimés.
Nous avons beaucoup de ces choses que notre application est quelque chose qui commence avec quelques informations de base pour un évènement, et au fil du temps, que l'événement est prévu, plus d'informations sont ajoutées. Mais lorsque l'information est ajoutée nous voulons nous assurer qu'il répond à la FK contrainte. FKs sont pour l'intégrité des données, mais toutes les données ne sont pas toujours connus au moment de l'initiale de données est inséré, de sorte que les valeurs null sont autorisées.