Clé étrangère 'Aucune' ou 'Non utilisée' lors de l'utilisation de GUID comme clé primaire

StackOverflow https://stackoverflow.com/questions/622437

Question

Nous sommes en train de créer une application pouvant devoir être répliquée sur de nombreux serveurs (j'espère que non, mais il est impossible de savoir si les clients auront besoin de leur propre copie client / serveur avant la publication du produit en ligne).

Le nombre de serveurs étant inconnu, j'ai décidé d'utiliser des GUID pour tous les ID de table transactionnelle. Étant donné que chaque client a sa propre base de données, j'ai l'intention d'utiliser la valeur par défaut NEWSEQUENTIALID () et que le tableau le plus grand n'ajoutera pas plus de 1,5 million de lignes par an (mais en moyenne 15 000 lignes). Je ne m'attends donc pas à un problème de performances. .

Cependant, je ne suis pas sûr de savoir comment gérer les cas dans lesquels nous souhaitons que la clé étrangère indique "Aucune sélection". Par exemple, un client a un seul utilisateur administrateur. Ceci est configuré comme une clé étrangère (login_id) à login.id (un GUID). Cependant, si un client ne dispose pas encore d'un utilisateur administrateur, comment configurer facilement une option "Aucun sélectionné"? clé?

Dans les applications précédentes, nous utilisions des colonnes IDENTITY et insérions une entrée fictive dans la plupart des tables avec un ID égal à 0. Existe-t-il une approche acceptée pour fournir des fonctionnalités similaires avec un GUID?

Était-ce utile?

La solution

Vous avez 3 options:

1) Dans la table référencée, ajoutez la ligne de valeur vide avec un GUID de tous les zéros, puis créez un lien vers cet enregistrement

.

2) Enregistrez simplement une valeur null pour les références vides

3) Ne disposez pas des enregistrements vides dans la table de référence, mais stockez un GUID zéro. Cela peut poser des problèmes si des jointures sont effectuées dans la base de données ou avec des rapports. Vous devrez coder pour ce cas particulier.

Je dirais que 1 et 2 sont les seules bonnes options.

Autres conseils

Le seul moyen sûr de le faire est de définir la valeur FK sur NULL. Si vous avez besoin de répliquer des données entre plusieurs serveurs, assurez-vous que chaque table que vous répliquez a un GUID comme clé primaire. Les relations de clé étrangère ne sont donc jamais un problème.

La réplication peut fonctionner très simplement de la manière suivante: répliquer les insertions et les mises à jour en premier dans l’ordre des tables parent à enfant, puis répliquer les enregistrements supprimés d’enfant à parent. (ordre inverse.)

J'espère que ça aide.

Il se peut que je manque quelque chose de vraiment évident ici, mais vous ne pouvez pas simplement le régler sur NULL?

Définissez le champ clé étrangère de la table enfant sur NULL et conservez le champ NULL en l'absence d'utilisateur admin. Des valeurs magiques telles que " 0 " les colonnes d’identité sont une catastrophe imminente.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top