Documentos de Académico
Documentos de Profesional
Documentos de Cultura
0 – 2017
Información: OTI OTI-CIPR-001
“Año del Buen Servicio al Ciudadano”
SERFOR
2022
Archivo: Estándares_de_Programación_con_Base_de_Datos_v1_0.doc
Páginas: 19 páginas
Fecha: 27.12.2017
Autor: Equipo de Desarrollo
Versión 1.0
Página 1 de 24
Oficina de Tecnología de la CÓDIGO: Versión: 1.0 – 2017
Información: OTI OTI-CIPR-001
“Año del Buen Servicio al Ciudadano”
LISTA DE CAMBIOS
Página 2 de 24
Oficina de Tecnología de la CÓDIGO: Versión: 1.0 – 2017
Información: OTI OTI-CIPR-001
“Año del Buen Servicio al Ciudadano”
CONTENIDO
Página 3 de 24
Oficina de Tecnología de la CÓDIGO: Versión: 1.0 – 2017
Información: OTI OTI-CIPR-001
“Año del Buen Servicio al Ciudadano”
1.1 Objetivo
Este documento es el Estándar de programación con Base de Datos en el marco de construcción del
Sistema Nacional de Información Forestal y Fauna Silvestre - SNIFFS.
Página 4 de 24
Oficina de Tecnología de la CÓDIGO: Versión: 1.0 – 2017
Información: OTI OTI-CIPR-001
“Año del Buen Servicio al Ciudadano”
Página 5 de 24
Oficina de Tecnología de la CÓDIGO: Versión: 1.0 – 2017
Información: OTI OTI-CIPR-001
“Año del Buen Servicio al Ciudadano”
Los identificadores de las bases de datos no deben contener abreviaturas, pero sí podrían estar formados
por siglas.
Los identificadores no contendrán prefijos, sufijos ni palabras con tilde.
Todas las instrucciones propias de SQL se escribirán en mayúsculas
Cada aplicativo que se implemente, deberá tener asignado un usuario de aplicación, el cual debe regirse a la
siguiente nomenclatura:
Los identificadores de las bases de datos no deben contener abreviaturas, pero sí podrían estar formados
por siglas.
Los identificadores no contendrán prefijos, sufijos ni palabras con tilde.
Todas las instrucciones propias de SQL se escribirán en mayúsculas
Los nombres de las tablas deberán tener notación pascal, en singular y deben ser sustantivos
descriptivos.
Ejemplo:
Página 6 de 24
Oficina de Tecnología de la CÓDIGO: Versión: 1.0 – 2017
Información: OTI OTI-CIPR-001
“Año del Buen Servicio al Ciudadano”
Fe_FechaRegistro datetime
Fecha cuando se creó el
registro.
Nu_IdUsuarioMod int
ID usuario quien
modificó el registro.
Fe_FechaModifica datetime
Fecha cuando se
modificó el registro.
Nu_IdUsuarioElimina int
ID usuario quien eliminó
el registro.
Fe_FechaElimina datetime
Fecha cuando se eliminó
el registro.
Página 7 de 24
Oficina de Tecnología de la CÓDIGO: Versión: 1.0 – 2017
Información: OTI OTI-CIPR-001
“Año del Buen Servicio al Ciudadano”
Las longitudes para las columnas de cadena se recomienda que tengan longitudes que sean múltiplos de
8.
Los índices para cada tabla tendrán la siguiente nomenclatura: IX_ NombreTabla_NombreColumna.
Si el índice es compuesto no se consideran los nombres de las columnas, se considera un nombre
descriptivo o en su defecto se agrega un correlativo después del nombre de la tabla.
Página 8 de 24
Oficina de Tecnología de la CÓDIGO: Versión: 1.0 – 2017
Información: OTI OTI-CIPR-001
“Año del Buen Servicio al Ciudadano”
[T]_[XX][Y]_[ZZZZZZZZZZ]
Donde: Descripción
T Prefijo de Tipo de Objeto
Tipo de tabla según su naturaleza, se
XX encuentra compuesto por dos caracteres
Tipo de tabla según su estructura, se
Y encuentra compuesto por un carácter
Nombre representativo de la tabla, se
ZZZZZZZZZZ recomienda que no exceda los 10 caracteres
MA MAESTRO
MV MOVIMIENTO
TM TEMPORAL
GE GENERAL
P Plano
C Cabecera
D Detalle
Página 9 de 24
Oficina de Tecnología de la CÓDIGO: Versión: 1.0 – 2017
Información: OTI OTI-CIPR-001
“Año del Buen Servicio al Ciudadano”
A continuación, algunos ejemplos de las combinaciones entre los tipos de tabla según
su naturaleza y su estructura:
MAP = Maestra Plana
MVC = Movimiento Cabecera
MVD = Movimiento Detalle
TMP = Temporal Plano
Ejemplo
En el caso de que sean tablas provenientes de la relación de dos o más tablas (tablas
relacionadas), se utilizará para nombrarla los nombres descriptivos de las tablas
relacionadas, utilizando una letra “_” para separarlas.
Página 10 de 24
Oficina de Tecnología de la CÓDIGO: Versión: 1.0 – 2017
Información: OTI OTI-CIPR-001
“Año del Buen Servicio al Ciudadano”
Formato: [TD]_[AAA_BB_CCC]
Donde : Descripción
TD Prefijo del tipo de dato almacenado en la columna
AAA_BB_CCC Nombre representativo de la columna. Debe describir el dato
que va a almacenar de manera entendible; si se usan
abreviaturas, éstas deberán ser mnemotécnicas.
Las columnas usadas como flag serán de tipo Char (1) y
nombrarse con una palabra que indique su estado en verdadero.
Las columnas de tipo Fecha y hora deben nombrarse con una
palabra que indique si es Fecha y/u hora
Nomenclatur
Tipo de dato Contenido a
BINARY Binario BL
IMAGE Binario BL
VARBINARY Binario BL
DATE Fecha FE
DATETIME Fecha FE
DATETIME2 Fecha FE
SMALLDATETIME Fecha FE
TIME Fecha FE
TIMESTAMP Fecha FE
BIGINT Número NU
BIT Número NU
DECIMAL Número NU
Página 11 de 24
Oficina de Tecnología de la CÓDIGO: Versión: 1.0 – 2017
Información: OTI OTI-CIPR-001
“Año del Buen Servicio al Ciudadano”
FLOAT Número NU
INT Número NU
MONEY Número NU
NUMERIC Número NU
NVARCHAR Número NU
REAL Número NU
SMALLINT Número NU
SMALLMONEY Número NU
TINYINT Número NU
CHAR texto TX
NCHAR texto TX
NTEXT texto TX
TEXT texto TX
VARCHAR texto TX
Ejemplos:
TX_DESCRIPCION
FE_FECHA_REGISTRO
FE_FECHA_DOCUMENTO
Las columnas de tipo llave primaria deben ubicarse al inicio de la definición de la tabla,
además debe cumplir el siguiente formato:
Formato: [TD]_[ID]_[ZZZZZZZZZZZ]
Donde : Descripción
TD Prefijo del tipo de dato almacenado en la columna
ID Prefijo de tipo de columna
Página 12 de 24
Oficina de Tecnología de la CÓDIGO: Versión: 1.0 – 2017
Información: OTI OTI-CIPR-001
“Año del Buen Servicio al Ciudadano”
Ejemplo
Tabla : T_MAP_TIPODOCUMENTO
Columna : NU_ID_TIPODOCUMENTO
1. Se utilizará la notación Pascal para todos los identificadores objetos de programación de base de datos
(procedimientos almacenados, funciones definidas por el usuario, desencadenadores, etc.)
Ejemplos:
Ejemplo:
pa_FacturaRegistrar, fn_PromedioMensualObtener
Ejemplo:
Objeto Prefijo
Página 13 de 24
Oficina de Tecnología de la CÓDIGO: Versión: 1.0 – 2017
Información: OTI OTI-CIPR-001
“Año del Buen Servicio al Ciudadano”
Desencadenador tr_
Vista vs_
Ensamblado en_
Ejemplos:
Página 14 de 24
Oficina de Tecnología de la CÓDIGO: Versión: 1.0 – 2017
Información: OTI OTI-CIPR-001
“Año del Buen Servicio al Ciudadano”
3.1 General
El identificador de un procedimiento almacenado deberá cumplir el siguiente formato:
pa_<IdentificadorObjeto>_<IdentificadorProcedimiento>
Donde
<IdentificadorObjeto> será una expresión, sin abreviaturas, que corresponda con el nombre de la tabla u
objeto sobre la cual se aplica el procedimiento.
<IdentificadorProcedimiento> será una expresión, sin abreviaturas, que describa la tarea llevada a cabo
por el procedimiento.
Ejemplo:
pa_Usuarios_ListarPorModulo
Utilice las instrucciones BEGIN y END (en MS-SQL Server) para contener el cuerpo del procedimiento
almacenado.
-- ***************************************************************************************************** --
-- Nombre : pa_ListarUsuariosPorModulo
-- Descripción: Procedimiento que Inserta los datos de un usuario y ejecuta un trigger de actualización
-- @002 Modificado por: Alex Tantachuco / 12-12-2013 / Se agregó columnas dni y tipo de guía
-- @003 Modificado por: Edwin Benavente / 14-12-2013 / Actualización de tablas maestras (8.3: REQ-0021)
Página 15 de 24
Oficina de Tecnología de la CÓDIGO: Versión: 1.0 – 2017
Información: OTI OTI-CIPR-001
“Año del Buen Servicio al Ciudadano”
-- ***************************************************************************************************** --
a. Utilizar marca de cambios con el formato “@<nro. correlativo>”, para llevar una numeración
correlativa de cada cambio.
b. Nombre Completo y Fecha en una sola línea.
c. Si la modificación la hace el creador, sólo deberá consignarse la fecha y la descripción de
la modificación.
d. Si la modificación la hace otra persona, se consignará el nombre, la fecha y la descripción.
e. En caso se tenga el documento de Especificación de Requerimientos también indicar el
Nro. de Sección y Nro. Requerimiento, entre paréntesis al final de la descripción del
cambio.
f. La sección de modificación se repetirá tantas veces como sea necesario.
Marca de cambios:
El código del cambio indicado en la Cabecera de Control de Cambios, se replicará enmarcando las
líneas de código afectadas, dentro de bloque I=INICIO, F=FIN.
Por ejemplo:
SELECT
PC.codigo_formula_polinomica_local
, P1.codigo_parametro
, PC.codigo_formula_polinomica_extranjera
, P2.codigo_parametro
, PC.id_partida_cliente
, PC.codigo_clase
...
...
--@0001 - I
CASE WHEN
PAD.rendimiento_factor_equivalencia=0
--@0001 - F
...
...
Página 16 de 24
Oficina de Tecnología de la CÓDIGO: Versión: 1.0 – 2017
Información: OTI OTI-CIPR-001
“Año del Buen Servicio al Ciudadano”
Comentarios
a. Las líneas de código que ya no son de interés a la lógica programada deberán ser
eliminadas.
b. En el caso que se necesite comentar una línea de código hacerlo de forma breve y
descriptiva.
Por ejemplo:
...
--Obtener Valores Anteriores
DECLARE @id_recurso bigint
DECLARE @id_oferta bigint
3.3 Parámetros
Los parámetros del procedimiento almacenado tendrán como nombres los mismos nombres de las
columnas de las tablas que representan, así como sus tipos y longitudes.
Si un parámetro de procedimiento no representa a ninguna columna de tabla se utilizará el tipo de dato
más adecuado en función a los posibles valores que dicho parámetro pueda almacenar. De tratarse de
parámetros de tipo cadena, se recomienda que la longitud sea múltiplo de 8.
Utilice el siguiente formato para comentar los parámetros:
Nota: las líneas rojas del gráfico indican que debe mantenerse la misma alineación para los tipos de
datos y los comentarios.
Página 17 de 24
Oficina de Tecnología de la CÓDIGO: Versión: 1.0 – 2017
Información: OTI OTI-CIPR-001
“Año del Buen Servicio al Ciudadano”
3.4 Variables
Todas las variables serán definidas al inicio del procedimiento y luego del bloque de cabecera. Después
de la palabra reservada BEGIN (en MS-SQL Server).
Las variables tendrán como nombres los mismos nombres de las columnas de las tablas que
representan, así como sus tipos y longitudes.
Si una variable no representa a ninguna columna de tabla debe utilizarse el tipo de datos más adecuado
en función a los posibles valores que dicha variable pueda almacenar. De tratarse de parámetros de tipo
cadena, se recomienda que la longitud sea múltiplo de 8.
Utilice el siguiente formato para comentar las variables:
Nota: las líneas rojas de gráfico indican que se debe mantener la misma alineación para los nombres de
las variables, sus tipos y sus comentarios.
Página 18 de 24
Oficina de Tecnología de la CÓDIGO: Versión: 1.0 – 2017
Información: OTI OTI-CIPR-001
“Año del Buen Servicio al Ciudadano”
Página 19 de 24
Oficina de Tecnología de la CÓDIGO: Versión: 1.0 – 2017
Información: OTI OTI-CIPR-001
“Año del Buen Servicio al Ciudadano”
o No utilizar “SELECT * “ en las consultas, siempre se deben indicar explícitamente las columnas
que se quieren extraer. Esto reduce el I/O mejorando el performance.
o Evitar el uso de sub-consultas (Subquery) si puede utilizarse en su lugar reuniones (JOINS)
entre resultados. Pero en caso que tenga sentencias SQL complejas y anidados utilizar sub-
consultas después del “FROM”. Evitar sub-consultas cargadas dentro del “SELECT”.
o Evitar el uso de tablas temporales (#nombreTabla) ya que generan más I/O. Considerar
primero el uso de sentencias SQL más avanzados, vistas, como tipo de dato “Table” y tablas
derivadas.
En caso no exista otra manera y/o se tenga un gran número de registros (>50,000 registros)
utilizar tablas temporales.
Página 20 de 24
Oficina de Tecnología de la CÓDIGO: Versión: 1.0 – 2017
Información: OTI OTI-CIPR-001
“Año del Buen Servicio al Ciudadano”
o Si va a utilizar un mismo resultado intermedio más de una vez en una consulta, utilice una
expresión de tabla común (CTE: Common Table Expression). Se recomienda el uso de tablas o
variables temporales.
Página 21 de 24
Oficina de Tecnología de la CÓDIGO: Versión: 1.0 – 2017
Información: OTI OTI-CIPR-001
“Año del Buen Servicio al Ciudadano”
o Utilizar la instrucción SET para asignar un valor constante a una variable, o para copiar valores
entre variables. No usar SELECT en estos casos.
o Acceder siempre a las tablas en el mismo orden, en todos los Procedimientos Almacenados y
Triggers, de esta manera evitamos generar Deadlocks; así como también mantener las
transacciones lo más pequeñas posibles. Programar según convenga para que las aplicaciones
reintenten la transacción en caso se genere un Deadlock (error 1205).
o Evitar hacer llamado de funciones repetitivamente en los procedimientos almacenados o
Triggers, en lugar de eso hacer el llamado una sola vez y guardarlo en alguna variable.
o Hacer uso de SHOWPLAN_TEXT o SHOWPLAN_ALL para analizar las consultas.
Usar el utilitario “Plan de Ejecución” del Business Intelligence Development Studio (en MS-SQL
Server).
Página 22 de 24
Oficina de Tecnología de la CÓDIGO: Versión: 1.0 – 2017
Información: OTI OTI-CIPR-001
“Año del Buen Servicio al Ciudadano”
%500" que aunque no siempre, a menudo impiden que el optimizador use un índice para
ejecutar la búsqueda. En adición, las expresiones que incluyen funciones sobre una columna o
expresiones que tienen la misma columna en ambos lados del operador, son non-sargable.
SELECT LocationID FROM Locations WHERE Specialities LIKE '%pples'
--Recomendado
SELECT LocationID FROM Locations WHERE Specialities LIKE 'A%s'
o Si tienes un query que usa la sentencia 'NOT IN' y ofrece un bajo desempeño, es debido a que
el optimizador tiene que realizar un nested table scan. Se recomienda utilizar alguna de las
siguientes alternativas (en este orden):
- EXISTS o NOT EXISTS
- IN
- Realizar un LEFT OUTER JOIN y chequear con una condición nula.
-- Query óptimo
Página 23 de 24
Oficina de Tecnología de la CÓDIGO: Versión: 1.0 – 2017
Información: OTI OTI-CIPR-001
“Año del Buen Servicio al Ciudadano”
Se recomienda usar el siguiente bloque de código TSQL cuando se vaya a borrar muchos registros por
tabla (normalmente cientos de miles) para que el motor MS-SQL no asuma un bloqueo por tabla sino por
página, al no ser muy grande lo que borra.
delete_more:
DELETE FROM tbl_depura WHERE fecha < '200600101'
SET ROWCOUNT 0
Página 24 de 24