64 votes

Clé étrangère MySQL autorisant NULL ?

Je suis en train d'assembler un site web d'images. Le schéma de base est un MySQL assez simple, mais j'ai du mal à représenter les drapeaux d'administration possibles associés à une image ("inapproprié", "sous copyright", etc.). Ma notion actuelle est la suivante :

tblImages (
    imageID INT UNSIGNED NOT NULL AUTO_INCREMENT,
    ...
);

tblImageFlags (
    imageFlagID INT UNSIGNED NOT NULL AUTO_INCREMENT,
    imageID INT UNSIGNED NOT NULL,
    flagTypeID INT UNSIGNED NOT NULL,
    resolutionTypeID INT UNSIGNED NOT NULL,
    ...
);

luResolutionTypes (
    resolutionTypeID INT UNSIGNED NOT NULL AUTO_INCREMENT,
    resolutionType VARCHAR(63) NOT NULL,
    ...
);

(tronqué pour faciliter la lecture ; les clés étrangères et les index assortis sont en ordre, je le jure)

tblImageFlags.flagTypeID est une clé étrangère sur une table de consultation des types de drapeaux, et comme vous pouvez l'imaginer tblImageFlags.resolutionTypeID devrait à clé étrangère sur luResolutionTypes.resolutionTypeID . Le problème est que, lorsqu'un drapeau est émis pour la première fois, il n'y a pas de type de résolution logique (je dirais qu'il s'agit d'une bonne utilisation de la fonction NULL ) ; toutefois, si une valeur est définie, elle doit faire l'objet d'une clé étrangère dans la table de consultation.

Je ne trouve pas de solution de contournement de la syntaxe MySQL pour cette situation. Existe-t-il une solution ? Les meilleurs candidats sont :

  • Ajouter un type de résolution "non modérée".
  • Ajouter un NULL l'entrée à luResolutionTypes.resolutionTypeID (cela fonctionnerait-il même dans un AUTO_INCREMENT colonne ?)

Merci pour cet aperçu !

PS Points bonus à celui qui me dira si, dans le cas des bases de données, il s'agit d'"index" ou d'"indices".


Suivi : merci à Bill Karwin d'avoir signalé ce qui s'est avéré être une erreur de syntaxe dans la structure de la table (ne pas définir une colonne à NOT NULL si vous voulez qu'il permette NULL !). Et dès que j'aurai assez de karma pour vous donner ces points bonus, je le ferai :)

98voto

Bill Karwin Points 204877

Vous pouvez résoudre ce problème en autorisant NULL dans la colonne de la clé étrangère tblImageFlags.resolutionTypeID .


PS Points bonus à celui qui me dira si, dans le cas des bases de données, il s'agit d'"index" ou d'"indices".

Le pluriel de indice devrait être indices .

Selon " Usage américain moderne " par Bryan A. Garner :

A des fins ordinaires, indices est le pluriel préférable, et non indices . ... Indices bien que moins prétentieux que pour un o dogmata , est néanmoins prétentieux. Certains écrivains préfèrent indices sur dans des contextes techniques, comme en mathématiques et les sciences. Bien que ce ne soit pas le meilleur pluriel pour indice , indices est admissible dans le sens "indicateurs". ... Évitez le singulier indice une rétroformation du pluriel indices .

4 votes

Que faites-vous avec les clés étrangères des colonnes de clé primaire qui ne sont pas autorisées à être NULL ? C'est un problème qui a tourmenté mes applications au fil des ans et je finis parfois par utiliser 0, ou par renoncer à la relation de clé étrangère, mais ce n'est pas optimal.

0 votes

@glyph : Cela n'a aucun sens. Si la colonne FK ne peut référencer aucune entrée PK spécifique, alors rendez le FK nullable. Si la colonne FK n'est pas autorisée à être nulle, alors elle doit faire référence à une entrée existante dans la colonne PK. L'utilisation de 0 ou d'une autre fausse valeur pour indiquer "aucune entrée référencée" n'est pas valable.

0 votes

Dans ce cas (au moins dans MySQL) la clé étrangère ne sera pas autorisée, car la fk ne peut pas être nulle si la pk n'est pas nulle, et les pks dans mysql sont toujours non nulles. Ce que je veux dire, c'est comment faire respecter l'intégrité référentielle entre le champ fk et la colonne pk si une valeur est présente, mais aussi autoriser les valeurs nulles. L'utilisation d'un 0 comme entrée fictive est certainement un hack qui nécessite des solutions de contournement ailleurs dans votre application, mais c'est valable.

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