web-dev-qa-db-fra.com

Une table de base de données peut-elle être sans clé primaire?

Quelqu'un peut-il me dire si une table d'une base de données relationnelle (telle que MySQL/SQL SERVER) peut être sans clé primaire?

Par exemple, je pourrais avoir la table day_temperature, où je vais enregistrer temperature et time. Je ne vois pas la raison d'avoir une clé primaire pour une telle table.

34
bodacydo

Techniquement, vous pouvez déclarer une telle table.

Mais dans votre cas, la time devrait devenir le PRIMARY KEY, car il est probablement faux d’avoir des températures différentes pour le même temps et probablement inutile de l’avoir plusieurs fois.

Logiquement, chaque table devrait avoir un PRIMARY KEY afin que vous puissiez distinguer deux enregistrements.

Si vous n'avez pas de clé candidate dans vos données, créez simplement une clé de substitution (AUTO_INCREMENT, SERIAL ou quelle que soit l'offre de votre base de données).

La seule excuse pour ne pas avoir un PRIMARY KEY est un journal ou un tableau similaire qui est sujet à une forte DML et ayant un index dessus aura un impact sur les performances au-delà du niveau de tolérance.

29
Quassnoi

Comme toujours ça dépend.

La table n'a pas avoir la clé primaire. Beaucoup plus important consiste à avoir index corrects. Le moteur de base de données dépend de la manière dont la clé primaire affecte les index (c’est-à-dire crée un index unique pour les colonnes de clé primaire).

Cependant, dans votre cas (et dans 99% des autres cas également), je voudrais ajouter une nouvelle colonne unique à incrémentation automatique} comme temp_id et en faire une clé primaire de substitution. 

Il rend beaucoup plus facile la maintenance de cette table - par exemple, la recherche et la suppression d'enregistrements (enregistrements dupliqués) - et croyez-moi, car chaque table a le temps de réparer les choses :(.

23
Grzegorz Gierlik

La clé primaire ne serait-elle pas naturellement l'heure? Auriez-vous jamais plus d'une température pour un temps donné?

Une meilleure question à poser serait, "Pourquoi voudriez-vous jamais faire une table sans une clé primaire"

11
Joel Martinez

Si la possibilité d'avoir des entrées en double (par exemple pour la même heure) ne pose pas de problème et si vous ne vous attendez pas à devoir interroger des enregistrements spécifiques ou une plage d'enregistrements, vous pouvez le faire sans clé.

5
p.marino

Vous n'avez pas besoin d'une PC, mais il est recommandé d'en avoir une. C'est le meilleur moyen d'identifier des lignes uniques. Parfois, vous ne voulez pas d'une PK int incrémentielle automatique, mais créez plutôt la PK sur quelque chose d'autre. Par exemple, dans votre cas, s'il n'y a qu'une seule ligne à la fois, vous devez créer le PK à l'heure. Elle accélère les consultations en fonction du temps et garantit leur caractère unique (vous pouvez être sûr que l'intégrité des données n'est pas violée):

5
reko_t

J'inclurais une clé de substitution/à incrémentation automatique, en particulier s'il existe une possibilité de double lecture de la durée et de la température. Vous n'auriez aucun autre moyen d'identifier de manière unique une ligne en double.

1
Steve

Selon votre réponse, je considérerais trois options:

  • mettre un PK sur les deux colonnes, de cette façon pour chaque fois, il ne peut y avoir qu'un seul temp et vice versa. Cette solution permet d'avoir plusieurs lignes avec la même température ou la même heure, mais il n'y aurait pas deux lignes avec la même température ET le même temps.
  • ne mettez pas de PK du tout mais mettez un index unique sur les deux colonnes. un index unique contenant les deux colonnes. cela autoriserait des valeurs nulles dans le temps et dans le temps, mais il faudrait plus d’espace pour maintenir l’index.

ces deux options sont préférables pour la vitesse de récupération si vous avez des lectures lourdes, mais réduiraient le taux d'insertion car les index devraient également être mis à jour.

  • ne mettez aucun index, ni PK. ce serait mieux pour les inserts mais très mauvais pour la recherche. utile pour la journalisation lorsque la récupération est effectuée par un autre mécanisme ou lorsque l'insertion d'un périphérique n'est pas nécessaire pour rechercher des doublons.

En outre, il est très important de prendre en compte la cardinalité ici et de penser aux conséquences futures de l’utilisation d’un nombre incrémenté automatiquement. Si vous prévoyez de faire BEAUCOUP d'insertions, même un bigint non signé auto-incrémenté constituerait un risque, car il finirait par s'épuiser. Dans votre exemple, je suppose que vous sauvegarderez des données quotidiennement - pendant combien de temps? ce serait problématique si vous économisiez du temp chaque minute ... alors je prendrai cela comme un exemple extrême.

Je suppose qu'il est préférable de penser à ce dont vous avez besoin à la table. faites-vous "enregistrer-oublier" pendant toute l'année pour la temp à chaque minute? Allez-vous utiliser fréquemment ce tableau pour la prise de décision en temps réel dans votre logique métier? Je pense qu'il est préférable de séparer les données nécessaires à la sauvegarde en temps réel (oltp) des données de sauvegarde à long terme qui seraient rarement nécessaires et que la latence d'extraction est autorisée (olap). Cela vaut même la peine de dupliquer les données dans deux tables différentes, l’une fortement indexée et effacée de temps en temps pour contrôler la cardinalité et la seconde est en fait sauvegardée sur un disque magique avec presque aucun index (il est possible de transférer un schéma de votre ordinateur). fs principal dans un autre fs).

0
Oooogi

Le temps deviendrait alors votre clé primaire. Cela vous aidera à indexer cette colonne afin que vous puissiez interroger des données en fonction d'une plage de dates. Le PK est ce qui rend finalement votre ligne unique. Dans votre exemple, la date/heure est le PK.

0
JonH

Lorsque vous répliquez une base de données sur mysql, une table sans clé primaire peut entraîner un retard dans la réplication.

http://lists.mysql.com/mysql/227217

L'erreur la plus commune lors de l'utilisation de ROW ou MIXED est l'échec de vérifiez que chaque table que vous souhaitez répliquer a une clé primaire sur il. C'est une erreur car lorsqu'un événement ROW (tel que celui documenté ci-dessus) est envoyé à l'esclave et que ni la copie du maître ne l'est ni la copie de la table de l'esclave n'a une clé primaire sur la table, il n'y a aucun moyen d'identifier facilement quelle rangée unique vous voulez réplication à changer.

0
Teruki Shinohara

Je rencontre la même question sur l’une des tables que j’ai faites.

Le problème était que le PK était supposé être composé de toutes les lignes de la table, tout va bien, mais cela signifie que la taille de la table va augmenter très rapidement avec chaque ligne insérée.

Je choisis de ne pas avoir de PK, mais seulement un index sur la rangée sur laquelle je fais la recherche.

0
Gleeb