2012-10-01 22 views
14

¿Hay alguna desventaja de no tener una clave primaria para una tabla en Postgres? Dado que todos los datos se almacenan desordenados en el montón de todos modos, ¿la clave principal es solo una forma de aplicar una clave única y un índice al mismo tiempo? ¿O hay una característica fundamental que proporciona una clave principal en una tabla en lugar de una tabla que no tiene una clave principal?Postgres No Principal Key drawback

+1

¿Cómo manejarías la actualización de un registro en una tabla sin una clave principal? – Olaf

+0

No es necesario recuperar filas únicas y las filas nunca se actualizan, solo se insertan. Si bien las filas tienen identidades individuales (UUID), solo se toman en rangos. Tengo índices en los rangos, pero no tiene sentido tener un índice en la clave única si puede evitarse. – AlexGad

+1

Estoy haciendo la pregunta específica, porque vengo de un fondo de SQL Server y decidir si tengo un índice agrupado en una tabla o en una tabla de almacenamiento dinámico es una decisión importante que hay que tomar. Con Postgres, esta decisión parece carecer de sentido ya que los datos siempre se almacenan desordenados en la tabla para comenzar. Sin embargo, quiero asegurarme de estar en lo correcto en esta suposición. ¿Cuál es el beneficio de un PK en Postgres vs, digamos una restricción única y un índice separado? ¿Hay alguna distinción o es solo una forma abreviada de proporcionar esas características? – AlexGad

Respuesta

15

por la documentación de Postgres (http://www.postgresql.org/docs/9.2/static/sql-createtable.html):

Técnicamente, clave primaria es simplemente una combinación de único y no se NULO, pero la identificación de un conjunto de columnas como clave principal también proporciona metadatos sobre el diseño del esquema, ya que una clave principal implica que otras tablas pueden confiar en este conjunto de columnas como identificador único para las filas.

Por experiencia, han creado un montón de mesas sin ellos. Uno de los mayores inconvenientes de no tener una clave principal es que no puede tener verificaciones de integridad referencial a través de una clave externa, ya que esa relación requiere una. Creo que algunas soluciones de replicación también requieren que haya una clave principal, o en el identificador de columna individual por fila.

+0

Ah, buen punto sobre el problema de replicación. Eso me olvidó por completo. Aunque tengo un UUID único en cada fila, debo asegurarme de que ningún PK no sea un problema de replicación (no hay claves externas para esto, así que no hay problema). Gracias. – AlexGad

+1

Otro problema que me viene a la mente es que la mayoría de los ORM (por ejemplo, Django) tienen problemas para tratar con tablas que no tienen claves principales. Por lo tanto, si alguna vez necesitas poner una IU en la parte superior de la tabla, entonces puede hacer la vida un poco más difícil para cualquiera que trabaje en ella. No es un gran problema, pero podría ser una consideración (dependiendo de los datos y lo que está sucediendo dentro de su empresa/equipo). –

+8

Una restricción de clave foránea requiere un índice 'UNIQUE' en la (s) columna (s) de destino. No tiene que ser una llave primaria. –