123 votes

Mauvaise pratique de Nullable clé étrangère ?

Disons que vous avez un tableau de Commandes avec une clé étrangère vers un Id de Client. Maintenant, supposons que vous souhaitez ajouter une Commande sans un Id de Client, (si ce devrait être possible, c'est une autre question) que vous auriez à faire la clé étrangère NULLE... Est-ce une mauvaise pratique ou préférez-vous travailler avec une table de lien entre les Commandes et les Clients? Même si le rapport est de 1 à n, une table de lien rendrait n à n. D'autre part, avec une table de lien, je n'ai pas les valeurs NULL... plus

Il n'y aura pas fait beaucoup de NULL dans la base de données, car un enregistrement avec une clé étrangère à la valeur NULL est juste temporairement jusqu'à ce qu'un client de la commande est ajoutée.

(Dans mon cas, ce n'est pas un Ordre et un Client).

EDIT: à propos d'une non affectés à la Clientèle à lier?

123voto

Charles Bretana Points 59899

Non Il n'y a rien de mal à accepter les valeurs null FKs. C'est souvent lorsque l'entité la FK est dans un (zéro ou un) de (1 ou plusieurs) relation avec les de Clé primaire de la table référencée.

Un exemple serait si vous aviez à la fois une adresse Physique et une adresse Postale attribut (colonne) dans une table, avec des FKs à une table d'Adresses. Vous pourriez faire de l'adresse Physique nullable à gérer lorsque l'entité n'a qu'une boîte postale (adresse postale), et de l'adresse postale nullable à gérer quand l'adresse postale est la même que l'adresse physique (ou pas).

59voto

Patrik Hägne Points 7735

Avoir le lien de la table est probablement une meilleure option. À moins qu'il ne viole pas la normalisation FNBC (Boyce-Codd forme normale). cependant, je serais favorable à être pragmatique. Si vous avez très peu de ces valeurs null et qu'ils ne sont que temporaires, je pense que vous devriez sauter le lien de la table car cela ne fait qu'ajouter à la complexité du système.

Sur une note de côté; à l'aide d'une table de lien n'est pas nécessairement le faire, il n à n, si vous dans le lien de l'utilisation de la table de la clé étrangère qui pointe vers votre table commandes comme la clé primaire de cette table de lien, la relation est encore de 1..n. Il ne peut être une entrée de la table de liaison par commande.

42voto

Erwin Smout Points 7499

"Nullable les colonnes peuvent être en 1FN par 5NF, mais pas dans 6NF selon ce que j'ai lu."

Seulement si vous savez mieux que Chris Date "quelle est la première forme normale signifie vraiment". Si x et y sont deux nullable, et en effet, dans un certain nombre de lignes x et y sont tous deux nuls, alors ", OÙ x=y" ne cède pas "vrai". Cela prouve au-delà de tout doute raisonnable que null n'est pas une valeur (parce que la valeur réelle est toujours égal à lui-même). Et depuis le RM prescrit qu'il doit y avoir une valeur dans chaque cellule d'un tableau", quelque chose qui peut-être contiennent des valeurs null, n'est pas un relationnel chose, et donc la question de 1FN ne même pas se poser.

"J'ai entendu dire que les valeurs null dans les colonnes général de briser le premier degré de la normalisation."

Voir ci-dessus pour la bonne raison sous-jacente de cet argument.

"Mais dans la pratique il est très pratique."

Seulement si vous êtes immunisé contre les maux de tête qu'il provoque généralement dans le reste du monde. L'un de ces maux de tête (et c'est seulement une mineure, comparativement à d'autres null phénomènes) est le fait que "x=y" dans SQL signifie en réalité "OÙ x est non nul, et y n'est pas nul et x=y", mais que la plupart des programmeurs ne sont tout simplement pas conscients de ce fait et il suffit de lire sur elle. Parfois, sans aucun dommage, d'autres fois non.

En fait, nullable colonnes de violer l'une des plus fondamentaux de la conception de la base de règles : ne pas combiner des informations distinctes des éléments dans une seule colonne. Les valeurs null ne exactement ce que parce qu'ils combinent la valeur booléenne "ce champ est/n'est pas vraiment" avec la valeur réelle.

14voto

pedromarce Points 3036

Je ne vois rien de mal avec ce que c’est juste une relation n-1 facultative qui sera représentée par une valeur null dans la clé étrangère. Sinon, si vous mettez votre table des liens, alors vous devrez gérer qu’il ne devienne pas une relation n-n, donc causant encore plus de difficultés.

4voto

Walter Mitty Points 8726

En option relations sont certainement possibles dans le modèle relationnel.

Vous pouvez utiliser les valeurs null pour exprimer l'absence d'une relation. Ils sont pratiques, mais ils vont vous causer le même maux de tête que les valeurs null, vous causer ailleurs. Un endroit où ils ne causent aucun mal à se rejoint. Les lignes qui ont une valeur null dans la clé étrangère ne correspond pas à toutes les lignes dans la table référencée. Afin qu'ils abandonnent une jointure interne. Si vous ne les jointures externes, vous allez avoir affaire avec des valeurs null de toute façon.

Si vous voulez vraiment éviter de valeurs null (6ème normale), vous pouvez décomposer le tableau. L'un des deux décomposé tableaux a deux colonnes de clé étrangère. L'un est l'option de clé étrangère que vous avez, et l'autre est une clé étrangère référençant la clé primaire de la table d'origine. Maintenant, vous devez utiliser les contraintes pour empêcher la relation devient de type plusieurs-à-plusieurs, il vous voulez pour l'en empêcher.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X