Faut-il combiner les clés étrangères qui pointent à la même table si toutes les colonnes sont nécessaires?

voix
0

Je rencontre souvent cette situation. Un exemple,

A userest identifié de manière unique par appId, externalUserId.

Le tableau xxxContracta une clé étrangère (fileUploadId, appId, externalUserId)à la table fileUploadqui assure le téléchargement de fichiers appartient à l'utilisateur spécifié.

Le tableau xxxContracta une clé étrangère (businessId, appId, externalUserId)à la table businessqui assure l'entreprise appartient à l'utilisateur spécifié.

Avec ce qui précède deux, nous garantissons un utilisateur upload de fichier ne sera pas utilisé comme un contrat pour les affaires de l'utilisateur B.


xxxContracta également une fileTypeIdcolonne qui est STORED GENERATEDà une certaine valeur qui dit : « Ce contrat est de type de fichier XXX_CONTRACT»

Le tableau xxxContracta aussi une clé étrangère (fileUploadId, fileTypeId)à la table fileUpload.

Cela garantit que nous utilisons uniquement le XXX_CONTRACTtéléchargement de fichiers pour xxxContract, et ne pas utiliser accidentellement d' autres types de fichiers.


Compte tenu de ce qui précède, nous avons cette situation où nous avons deux clés étrangères qui pointent à la même table fileUpload, et ont même des colonnes qui se chevauchent,

  • (fileUploadId, appId, externalUserId)
  • (fileUploadId, fileTypeId)

Et toutes les colonnes sont NOT NULL.

Donc, il me semble comme il est sûr de combiner les clés étrangères dans une clé plus étrangère,

(fileUploadId, appId, externalUserId, fileTypeId)

Et nous aurons toujours les mêmes garanties qu'auparavant.


Mon sentiment profond est que je ne devrais pas combiner les clés étrangères , car en les séparant par le sens et donner les FKs nom significatifs aide à maintenabilité.

Mais je ne l'ai jamais eu une éducation formelle avec ces choses donc je voudrais savoir ce que la norme de l'industrie est.

Connexes, est-il un avantage de performance pour les combiner en fonction de les séparer?

Créé 07/11/2018 à 20:11
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
0

Mais je ne l'ai jamais eu une éducation formelle avec ces choses donc je voudrais savoir ce que la norme de l'industrie est.

La norme est, qu'il n'y a pas de norme.

Comme vous avez déjà noté, vous pouvez utiliser plusieurs colonnes pour définir une clé primaire. Ceci est appelé une clé primaire naturelle , par exemple: un utilisateur peut être identifié de manière unique par nom, prénom - et date de naissance. (au moins presque jamais)

Ce genre de touches est souvent appelées touches composites, parce que chaque colonne seule ne fonctionne pas, seulement combinés, ils forment une clé primaire.

Sont également bien connues clés primaires Surrogate (ou) artifical: idcolonne, en utilisant l' auto-incrément.

Alors, à votre question: Oui, si vous avez 3 colonnes qui forment déjà une clé primaire naturelle, il est sûr d'ajouter completly plusieurs colonnes. Étant donné que les 3 colonnes déjà présentes identifiera de manière unique la ligne, il n'y a pas de mal à ajouter un 4e, 5e ou même 6e colonne à la clé.

Que vous allez utiliser des clés naturelles ou de substitution depens de la préférence personnelle, je dirais. Je ne jamais utiliser les touches naturelles, même sur les tables où cela est possible.

Gardez à l'esprit que chaque fois que vous devez supprimer / mettre à jour quelque chose, vous devez toujours connaître la clé primaire. par conséquent, avec les touches naturelles, vous devez déplacer plusieurs valeurs par plusieurs méthode des appels, alors que les clés de substitution offrent l'avantage d'avoir juste « un » id pour identifier une ligne. Plus d'informations nécessaires.

Côté performance, je suppose que les clés primaires de substitution (Integer basée) ont tendance à être plus rapide que (à base de chaînes) clés naturelles. Il est encore moins colonnes à considérer lors de l'écriture de requêtes et / ou la conception d'index.

Créé 07/11/2018 à 21:57
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more