2012-10-01 3 views
14

Y a-t-il un inconvénient à ne pas avoir de clé primaire pour une table dans Postgres? Puisque toutes les données sont stockées de toute façon dans le tas, la clé primaire est-elle juste un moyen d'appliquer une clé unique et un index en même temps? Ou y a-t-il une caractéristique fondamentale qu'une clé primaire fournit dans une table par opposition à une table qui n'a pas de clé primaire?Postgres Pas de problème de clé primaire

+1

Comment gérez-vous la mise à jour d'un enregistrement dans une table sans clé primaire? – Olaf

+0

Ne pas besoin de récupérer des lignes uniques et les lignes ne sont jamais mises à jour, seulement insérées. Bien que les lignes aient des identités individuelles (UUID), elles ne sont saisies que dans des plages. J'ai des index sur les plages, mais il est inutile d'avoir un index sur la clé unique si cela peut être évité. – AlexGad

+1

Je pose la question spécifique, parce que je viens d'un fond de SQL Server et de décider si avoir un index clusterisé sur une table ou une table de tas seulement est une décision importante à prendre. Avec Postgres, cette décision semble dénuée de sens puisque les données sont toujours stockées sans ordre dans la table pour commencer. Cependant, je veux m'assurer que j'ai raison dans cette hypothèse. Quel est l'avantage d'un PK dans Postgres vs, disons une contrainte unique et un index séparé? Y a-t-il une distinction ou est-ce simplement un raccourci pour fournir ces fonctionnalités? – AlexGad

Répondre

15

par la documentation Postgres (http://www.postgresql.org/docs/9.2/static/sql-createtable.html):

Techniquement, la clé primaire est simplement une combinaison de UNIQUE et NON NULL, mais l'identification d'un ensemble de colonnes comme clé primaire fournit également métadonnées sur la conception du schéma, comme une clé primaire implique que d'autres tables peuvent compter sur cet ensemble de colonnes comme un identifiant unique pour les lignes.

Par expérience, j'ai créé beaucoup de tables sans eux. L'un des plus grands inconvénients de ne pas avoir de clé primaire est que vous ne pouvez avoir aucune vérification d'intégrité référentielle via une clé étrangère - puisque cette relation en nécessite une. Je pense que certaines solutions de réplication requièrent également une clé primaire ou un identifiant de colonne unique par ligne.

+0

Ah, bon point sur le problème de réplication. Cela a complètement glissé dans mon esprit. Bien que j'aie un UUID unique dans chaque rangée, je devrais m'assurer qu'aucun PK ne sera un problème de réplication (pas de clés étrangères pour ceci donc ce n'est pas un problème). Merci. – AlexGad

+1

Un autre problème qui vient à l'esprit est que la plupart des ORM (par exemple Django) ont des problèmes avec les tables qui n'ont pas de clés primaires. Donc, si jamais vous avez besoin de mettre une interface utilisateur sur le dessus de la table, cela peut rendre la vie un peu plus difficile pour quiconque travaille dessus. Pas une affaire énorme, mais pourrait être une considération (selon les données et ce qui se passe au sein de votre entreprise/équipe). –

+8

Une contrainte de clé étrangère nécessite un index 'UNIQUE' sur la ou les colonnes cibles. Ne doit pas être une clé primaire. –

Questions connexes