none
Claves primarias y alternas RRS feed

  • Pregunta

  • Buenas tardes.. No he encontrado la manera de definir una llave alterna, que para mi concepto es diferente a una primaria o ajena.

    Tengo un tabla con estas características:

    1)  Cod_Clte_PK        

    2)  Fech_Venta_PK

    3)  Clase_Compte_Venta_PK

    4)  Numero_Compte_PK

    5) Fech_Venta_AK

    6)  Clase_Compte_Venta_AK

    Los campos indicados desde el numeral 1 hasta el 4, los he definido como "Primary Key"

    Ahora bien, los campos 5 y 6 necesito definirlos como la llave alterna, pero no he encontrado como hacerlo.

    Si alguno de ustedes tiene la sintaxis de como definir la "Alternate Key" les estaría mu agradecido.

    Atte.

    Gonzalo Epinoza


    Saludos, Gonzalo

    domingo, 10 de diciembre de 2017 22:11

Respuestas

  • Si no utilizo llaves primarias o alternas la búsqueda será leyendo cada registro en forma secuencial y validando los controles, pero esto en un ambiente de producción con millones de registros y cientos de clientes seria larga la espera.

    La elección de una clave primaria no se sustenta en la "anticipación de mecanismos" para otorgar rendimiento a las posibles consultas que se podrían realizar contra la tabla, el objetivo de una clave primaria es otorgar "identificación única" a una fila entre todas las demás, en ese sentido es que yo insisto en ocupar una clave primaria subrogada en lugar de una clave primaria natural -y con mayor sustento aún- si la clave primaria natural será compuesta por varias columnas.

    La manera de "decirle/pedirle" al motor de base de datos que nos devuelva los resultados de una consulta en el menor tiempo posible es a través de la creación de índices, pero la creación de índices va a estar sujeta a las consultas que realicemos contra la tabla (poniendo atención en las expresiones de unión, filtro o ordenamiento), no es una decisión menor, por cuanto la carencia de índices tendrá el mismo efecto, en los tiempos de respuesta, que los índices mal definidos.

    Para el caso que presentas, yo, insisto, definiría una clave primaria (numérica auto-generada de manera secuencial) y, en base a las necesidades de las consultas contra la tabla que nos comentas, crearía uno o dos índices:

    - Para atender la búsqueda basada por cliente y fecha (coloca a la izquierda la columna que contenga valores ampliamente selectivos)

    CREATE NONCLUSTERED INDEX IX_INDEXNAME1 ON dbo.TableName(idCliente, Fecha)

    - Para atender la búsqueda basada en sólo fecha

    CREATE NONCLUSTERED INDEX IX_INDEXNAME2 ON dbo.TableName(Fecha)

    La necesidad del segundo índice se sustenta en que el optimizador de consultas no utilizaría el primer índice para la búsqueda por sólo fecha, sí por sólo cliente.

    martes, 12 de diciembre de 2017 14:26
  • Buenas noches...

    Leyendo un poco, utilice la sentencia INDEX, con el cual quedo como necesito.

    Gracias a todos por su valioso tiempo.


    Saludos, Gonzalo

    jueves, 22 de febrero de 2018 5:07

Todas las respuestas

  • ¿Por qué creas las columnas 5 y 6? ¿no es lo mismo que las columnas 2 y 3? ¿cuál es el objetivo?

    Si lo haces para "reforzar" la unicidad de la clave primaria (lo siento si suena disparatado mi sospecha) no necesitas hacerlo, porque es implícito, en una clave primaria, la restricción de unicidad.

    Por otro lado, no me gusta una clave primaria compuesta, puede no importarte mis preferencias, pero desde mi forma de ver las cosas "estorba" por decirlo menos, yo sólo las uso cuando defino el identificador en una tabla de unión. Te recomiendo crear una clave primaria subrogada, un valor numérico que podría ser autogenerado, si bien no tiene un significado para el negocio, es simple y útil para identificar las filas.

    domingo, 10 de diciembre de 2017 23:27
  • Además de lo que te recomienda Willams, para crear una clave alternativa se crea un unique index, al fin y al cabo lo que quieres es garantizar la unicidad. No es necesario redefinir la clave primaria.

    Conceptualmente además si los campos 2, y 3 ya son pk, añadirle el 1 no tiene sentido desde el punto de vista del álgebra. Si 1 es una clave subrrogada(no natural) hazla única de verdad y que tu primary key sea solo 1, y que tu ak (índice único) sean 2 y 3)


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    lunes, 11 de diciembre de 2017 6:47
    Moderador
  • Te sugiero que revises los conceptos de:

    - Claves Candidatas

    - Clave Primaria

    - Claves Alternas

    Muchas veces tenemos mas de una clave para identificar unicamente filas de una tabla (Claves Candidatas), pero de esta una cumple condiciones mas favorables y termina por ser la clave primaria. El resto de claves candidatas, que no es la primaria, se consideran alternas.

    Dicho lo anterior, consideras tu que las columnas (Fech_Venta, Clase_Compte_Venta) identifican unicamente filas de esa tabla?

    En cuanto a usar una clave subrrogada o no, deberas de todas maneras declarar una restriccion de unicidad (o indice unico) para claves naturales.


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas


    lunes, 11 de diciembre de 2017 13:48
  • Estimados colegas... Aprecio como el que mas sus opiniones.

    Tratare de explicar brevemente el porque necesito las claves alternas.

    Tomando el ejemplo que puse:

    1) Para poder determinar las ventas de un cliente en una fecha especifica o un rango de fecha acceso por la clave principal (primary key) de esta forma voy directo al grupo que necesito

    2)  Para poder determinar TODAS las ventas sin importar el cliente, en una fecha determinada o en un rango de fecha, entonces accedo por la clave alterna.

    Si no utilizo llaves primarias o alternas la búsqueda será leyendo cada registro en forma secuencial y validando los controles, pero esto en un amiente de producción con millones de registros y cientos de clientes seria larga la espera.

    Por este motivo es que recurro a usted para que tengan la amabilidad de indicarme la sintaxis para definir una llave alterna.


    Saludos, Gonzalo

    martes, 12 de diciembre de 2017 3:26
  • Hola, no necesitas para eso que sea una clave alternativa, basta con crear un índice

    Create index ix_loquesea on tutabla (fecha,importeventa)

    si preguntas fechas e importes de ventas solamente se recorrerá ese índice sin acceder a través de l a clave primaria.

    El concepto que buscas no tiene que ver con el de clave alterna, que es lo que te han comentado los compañeros, cuando usas la palabra clave automáticamente has de pensar en unicidad, y las ventas en cada fecha (gracias a dios) no son únicas.

    Espero que te sirva.


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    martes, 12 de diciembre de 2017 7:09
    Moderador
  • Si no utilizo llaves primarias o alternas la búsqueda será leyendo cada registro en forma secuencial y validando los controles, pero esto en un ambiente de producción con millones de registros y cientos de clientes seria larga la espera.

    La elección de una clave primaria no se sustenta en la "anticipación de mecanismos" para otorgar rendimiento a las posibles consultas que se podrían realizar contra la tabla, el objetivo de una clave primaria es otorgar "identificación única" a una fila entre todas las demás, en ese sentido es que yo insisto en ocupar una clave primaria subrogada en lugar de una clave primaria natural -y con mayor sustento aún- si la clave primaria natural será compuesta por varias columnas.

    La manera de "decirle/pedirle" al motor de base de datos que nos devuelva los resultados de una consulta en el menor tiempo posible es a través de la creación de índices, pero la creación de índices va a estar sujeta a las consultas que realicemos contra la tabla (poniendo atención en las expresiones de unión, filtro o ordenamiento), no es una decisión menor, por cuanto la carencia de índices tendrá el mismo efecto, en los tiempos de respuesta, que los índices mal definidos.

    Para el caso que presentas, yo, insisto, definiría una clave primaria (numérica auto-generada de manera secuencial) y, en base a las necesidades de las consultas contra la tabla que nos comentas, crearía uno o dos índices:

    - Para atender la búsqueda basada por cliente y fecha (coloca a la izquierda la columna que contenga valores ampliamente selectivos)

    CREATE NONCLUSTERED INDEX IX_INDEXNAME1 ON dbo.TableName(idCliente, Fecha)

    - Para atender la búsqueda basada en sólo fecha

    CREATE NONCLUSTERED INDEX IX_INDEXNAME2 ON dbo.TableName(Fecha)

    La necesidad del segundo índice se sustenta en que el optimizador de consultas no utilizaría el primer índice para la búsqueda por sólo fecha, sí por sólo cliente.

    martes, 12 de diciembre de 2017 14:26
  • Adicionalmente el gran Javier Loría, ha escrito precisamente hace poco esto.

    https://javiersql.wordpress.com/2017/12/12/sql-server-como-encontrar-indices-duplicados-en-sql-server/

    Si le das un vistazo, veras que te aclara muchas cosas


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    martes, 12 de diciembre de 2017 17:29
    Moderador
  • Buenas noches...

    Leyendo un poco, utilice la sentencia INDEX, con el cual quedo como necesito.

    Gracias a todos por su valioso tiempo.


    Saludos, Gonzalo

    jueves, 22 de febrero de 2018 5:07