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.
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.
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 :(.
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"
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é.
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):
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.
Selon votre réponse, je considérerais trois options:
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.
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).
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.
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.
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.