Fecha: 12/01/2011
TALLER DE PROYECTOS 2
PROFESORES: Villanueva Espinoza, Mara del Rosario Moreno Molina, Joel SECCIN: EA01
Fecha: 12/01/2011
NDICE 1. INTRODUCCIN..................................................................................................................3 1.1 PROPSITO DEL DOCUMENTO................................................................................................3 1.2 ALCANCE..............................................................................................................................3 1.3 CONTROL DE VERSIONES......................................................................................................3 2. NORMAS GENERALES ......................................................................................................4 2.1 BASE DE DATOS....................................................................................................................4 2.2 INDICES.................................................................................................................................4 2.3 CONEXIONES A SERVIDOR.....................................................................................................5 2.4 NOMENCLATURA...................................................................................................................5 3. ESTANDARES DE NOMENCLATURA.............................................................................6 3.1 DEFINICIN DE VARIABLES, PARMETROS Y TIPOS DE DATOS.............................................6 3.2 TABLAS.................................................................................................................................7 3.3 COLUMNAS............................................................................................................................8 3.4 CONSTRAINTS........................................................................................................................9 3.5 STORED PROCEDURES...........................................................................................................9 3.6 TRIGGERS............................................................................................................................13 4. PROGRAMACION SQL.....................................................................................................14 4.1 OPTIMIZAR CONSULTAS SQL...............................................................................................16 5. SEGURIDAD........................................................................................................................18 5.1 ACCESO A LA BASE DE DATOS............................................................................................18 5.2 INTEGRIDAD........................................................................................................................18
Fecha: 12/01/2011
1.2 Alcance
Dirigido a los equipos responsables de las areas de desarrollo de la DGG
Fecha: 12/01/2011
2.2 Indices
Dado que ste es el punto ms crtico dentro de todo desarrollo, se debern indexar las columnas que sean estrictamente necesarias. Una tabla deber tener como mximo 4 a 5 ndices. El desarrollador tendr que tener la seguridad de que los ndices definidos estn siendo utilizados por el SQL SERVER, de lo contrario tendrn que ser borrados. No olvidar que los ndices nos ayudan para consultar informacin, pero, retarda la actualizacin de la misma.
Fecha: 12/01/2011
En las tablas de mayor incidencia en actualizaciones, los ndices CLUSTERED debern contar con un FILLFACTOR adecuado para evitar la fragmentacin de la tabla. En la documentacin se deber detallar cules son las tablas que utilizan FILLFACTOR
2.4 Nomenclatura
El nombre de las Bases de Datos deber ser corto, descriptivo y que permita determinar fcilmente su propsito, por ejemplo : Sistema de Presupuesto Base de Datos Presupuesto. Por defecto, no se aceptan espacios en blanco en medio de los identificadores; sin embargo, su uso est permitido si se usan identificadores delimitados por comillas dobles. En el presente estndar, no se permiten los espacios en blanco como parte de un identificador. Utilizar para los nombre de objetos palabras en singular. Para la definicin de nombre de objetos de base de datos de acuerdo al caso se usar el caracter underscore _ para separar las palabras_del_nombre.
Fecha: 12/01/2011
Nomenclatura : @XY_NOMBRE @ : Smbolo @ (arroba) es obligatorio anteponerlo por restricciones propias del manejador de Base de datos. X : Letra Mayscula que identifica el tipo de Objeto se a identificado P y L para parmetros y variables locales respectivamente. Y : Es una letra e identifica el tipo de dato del objeto, considerar la tabla (1), pero con los caracteres en mayscula.
Fecha: 12/01/2011
3.2 Tablas
2 3 4 Nomenclatura: XXX_NOMBRE_TABLA XXX : Son letras maysculas e identifican un prefijo del aplicativo. Por Ejemplo para el proyecto Log de Auditora referido al ambito de seguridad, sera: SEG
Nota : Cuando se creen tablas temporales aadir el prefijo TEM para reconocerlas Ejemplo: #TEMP_TABLA_TEMPORAL
Fecha: 12/01/2011
3.3 Columnas
5 6 Nomenclatura: xxxxy_znombre_columna xxxx : Los cuatro (4) primeros caracteres son letras minsculas e identifican el prefijo de la tabla de la cual forma parte el campo y : Es una letra minscula e identifica al objeto, en este caso a una columna y es representada por la letra c _ : Es un smbolo (raya abajo) z : Es una letra minscula e identifica el tipo de dato del objeto, considerar la tabla (1). nombre_columna : Se detalla el nombre de la columna, toda la palabra en minsculas y no tiene un lmite de caracteres establecido, a excepcin de los lmites del manejador de base de datos, considerando el separador (raya abajo) para nombres de columna conformados por ms de una palabra. Los nombres de las columnas ser descriptivos, en singular y en minsculas. Ejemplo :
CREATE TABLE SEGT_USUARIO (
usprc_vcodigo_usuario varchar(40) NOT NULL , usprc_ccodigo_perfil char (3) NULL , usprc_csituacion char(1) NULL )
Fecha: 12/01/2011
3.4 Constraints
Primary Key: Foreign Key: Unique: Default: Check: Ejemplo: PK_NombreTabla FK_NombreTablaOrigen_NombreTablaReferenciada UQ_NemnicoTabla_NombreUnique DF_NemnicoTabla_NombreColumna CK_NemonicoTabla_NombreCheck
PK_ SEGT_USUARIO FK_ SEGT_USUARIO_ SEGT_USUARIO_PERFIL UQ_USUARIO_CODIGO_USUARIO DF_ USUARIO_SITUACION CK_ USUARIO_PERFIL
Fecha: 12/01/2011
10
Fecha: 12/01/2011
18 19 NOMBRE_STORED_PROCEDURE : Se detalla el nombre del stored procedure, toda la palabra en maysculas y no tiene un lmite de caracteres establecido, a excepcin de los lmites del manejador de base de datos, considerando el separador (raya abajo) para nombres de objeto conformados por ms de una palabra. 20 21 El nombre del Procedimiento debe ser singular y en mayscula. 22 Ejemplo: SEGSS_USUARIO SEGSS_PERFILES_X_USUARIO 23
NOTA:
Los nombres de los Stored Procedures NO deben comenzar con sp, esto porque generalmente el SQL piensa que son system procedures y los busca primero en la Base de Datos master SET NOCOUNT ON (elimina la notificacin del nro. de registros afectados por cada sentencia SQL lo cual incrementa el performance)
Estructura del Stored Procedure: Nombre de stored procedure Comentarios: Todos los stored procedures deberan tener los siguientes comentarios (Objetivo, Funcionalidad, descripcin de variables entre otros) Procedimiento: Nombre del procedimiento Input/Output : Descripcin de Parmetros de entrada y salida Descripcin : Descripcin / Objetivo de funcionalidad del stored procedure Se asume : N/A Retorno : N/A Notas : N/A Modificaciones : Descripcin de Modificaciones Autor : Nombre y Apellido del autor del Procedimiento Fecha y Hora : Fecha y hora de Creacin/ModificacinCambios Importantes Declaracin de Parmetros Input y/o Output Input Output Declaracin Variables locales Maysculas y minsculas Sentencias SQL Palabras del lenguaje SQL, y funciones de sistema en MAYUSCULAS, columnas y otras variables en Maysculas. 11
Fecha: 12/01/2011
Sentencias legibles e identadas (cada clusula SQL en una lnea nueva) Ejemplo: /* ******************************************************************** Propsito : Muestra los perfiles que posee el usuario Creado por : David Rubios Fecha y hora : 20/01/2009 - 04:38 pm. Test : exe SEGSS_PERFILES_X_USUARIO ********************************************************************* */ CREATE PROCEDURE DBO.SEGSS_PERFILES_X_USUARIO <Declaracin de Parmetros Input y/o Output> AS <Declaracin de Variables locales> <Sentencias SQL> GO NOTAS: No utilizar prefijo sp para los stored procedures. Dicho prefijo esta reservado para identificar stored procedures del sistema. No usar prefijo fn para funciones definidas por el usuario, Dicho prefijo esta reservado para identificar funciones propias del sistema. No usar prefijo xp_, para extended stored procedures, cual es un prefijo reservado para identificar system extended stored procedures. Se debern optimizar el uso de los Datatypes. Los tipos de datos VARCHAR se utilizarn slo para longitudes mayores a 20 caracteres, normalmente aplicado a campos de descripcin, nombres, etc., en el cual no se sabe el tamao que ocupa un texto determinado. En el caso de tener columnas cuyo valor numrico no va a exceder de 255 se deber emplear el tipo de dato TINYINT. Los tipos de datos definidos por usuario (User Defined Datatypes) debern ser debidamente documentados.
12
Fecha: 12/01/2011
3.6 Triggers
24 Nomenclatura: 25 26 XXXXYZ_NOMBRE_TRIGGER 27 28 XXXX : Son letras maysculas e identifican un prefijo del aplicativo. Por Ejemplo para el proyecto Log de Auditora referido al mbito de seguridad, sera: SEG 29 Y : Es una letra mayscula e identifica al objeto, en este caso a un stored procedure y es representado por la letra R. 30 Z : Representa el tipo de lgica del objeto, Para el caso del aplicativo Log de Auditora se presentan los siguientes tipos identificados en la tabla (3): 31 CARACTER I U D G Tabla 3 TIPO DE LOGICA INSERT UPDATE DELETE GENERAL
32 33 _ : Es un smbolo (raya abajo). 34 35 NOMBRE_TRIGGER : Se detalla el nombre del Trigger, equivalente a la tabla para la cual fue creada, toda la palabra en maysculas y no tiene un lmite de caracteres establecido, a excepcin de los lmites del manejador de base de datos, considerando el separador (raya abajo) para nombres de objeto conformados por ms de una palabra. 36 37 El nombre del Trigger debe ser singular y en mayscula. 38 Ejemplo: SEGRU_USUARIO SEGRG_OPCION_X_USUARIO
13
Fecha: 12/01/2011
4. PROGRAMACION SQL
Obligatoriamente todos los sistemas a desarrollarse debern invocar STORED PROCEDURES. No se debern poner sentencias SQL en el cliente. Esto genera una gran baja en la performance de los sistemas. En ningn caso el desarrollador podr forzar el uso de un ndice dentro de un STORED PROCEDURE y tampoco deber colocar sentencias que alteren el comportamiento de los bloqueos. Cuando escriba sentencias SQL, use todo en appercase para keywords y mixed case ( maysculas y minsculas) para elementos de Database (base de datos), tales como tablas, columnas y vistas. Poner cada sentencia mayor de SQL sobre lneas separadas para facilitar su lectura y edicin, por ejemplo: o o o
No se deben usar procedimientos encriptados. Todo aplicativo deber evitar usar cursores definidos en SQL SERVER, dado que stos consumen muchos recursos. En la mayora de los casos se pueden transformar los cursores a TransactSQL. Las vistas debern ser utilizadas para simplificar los queries. En ningn caso se otorgarn permisos sobre columnas, por lo tanto se deber crear una vista para que se le otorgue permiso de SELECT a toda la vista. Utilizar maysculas para las sentencias propias del SQL
Ejemplo.-
14
Fecha: 12/01/2011
SELECT
Utilizar el Tabulador para separar los campos de una condicin (en la medida de lo posible) Ejemplo.SELECT
Indentar el Cdigo para conservar un orden Ejemplo.CREATE PROCEDURE p_BUSCARCADENA ( @vchVariable VARCHAR(255), @vchTipo VARCHAR(1) ="" ) AS BEGIN IF LTRIM(RTRIM(@vchVariable)) <> "*" IF @vchTipo = "" SELECT NOMBRE = name , TIPO = type , CREACION = crdate FROM sysobjects WHERE name LIKE '%'+ @vchVariable + '%' ORDER BY type, name ELSE SELECT NOMBRE = name , TIPO = type , CREACION = crdate FROM sysobjects WHERE name LIKE '%'+ @vchVariable + '%' AND type = RTRIM(LTRIM(@vchTipo)) ORDER BY name
Estndares de Programacin SQL Server Matricula de Acdemias
15
Fecha: 12/01/2011
END
Normaliza las tablas, al menos hasta la tercera forma normal, para asegurar que no hay duplicidad de datos y se aprovecha al mximo el almacenamiento en las tablas. Si hay que desnormalizar alguna tabla piensa en la ocupacin y en el rendimiento antes de proceder. Los primeros campos de cada tabla deben ser aquellos campos requeridos y dentro de los requeridos primero se definen los de longitud fija y despus los de longitud variable. Ajusta al mximo el tamao de los campos para no desperdiciar espacio. Es muy habitual dejar un campo de texto para observaciones en las tablas. Si este campo se va a utilizar con poca frecuencia o si se ha definido con gran tamao, por si acaso, es mejor crear una nueva tabla que contenga la clave primaria de la primera y el campo para observaciones.
Los ndices son campos elegidos arbitrariamente por el constructor de la base de datos que permiten la bsqueda a partir de dicho campo a una velocidad notablemente superior. Sin embargo, esta ventaja se ve contrarrestada por el hecho de ocupar mucha ms memoria (el doble ms o menos) y de requerir para su insercin y actualizacin un tiempo de proceso superior. No indexar todos los campos de una tabla extensa ya que doblamos el tamao de la base de datos. Igualmente, tampoco sirve de mucho el indexar todos los campos en una tabla pequea ya que las selecciones pueden efectuarse rpidamente de todos modos. Un caso en el que los ndices pueden resultar muy tiles es cuando realizamos peticiones simultneas sobre varias tablas. En este caso, el proceso de seleccin puede acelerarse sensiblemente si indexamos los campos que sirven de nexo entre las dos tablas. Los ndices pueden resultar contraproducentes si los introducimos sobre campos triviales a partir de los cuales no se realiza ningn tipo de peticin ya que, adems 16
Fecha: 12/01/2011
del problema de memoria ya mencionado, estamos ralentizando otras tareas de la base de datos como son la edicin, insercin y borrado. Es por ello que vale la pena pensrselo dos veces antes de indexar un campo que no sirve de criterio para bsquedas o que es usado con muy poca frecuencia por razones de mantenimiento. Campos a Seleccionar
En la medida de lo posible hay que evitar que las sentencias SQL estn embebidas dentro del cdigo de la aplicacin. Es mucho ms eficaz usar vistas o procedimientos almacenados por que el gestor los guarda compilados. Si se trata de una sentencia embebida el gestor debe compilarla antes de ejecutarla. Seleccionar exclusivamente aquellos que se necesiten No utilizar nunca SELECT * por que el gestor debe leer primero la estructura de la tabla antes de ejecutar la sentencia Si utilizas varias tablas en la consulta especifica siempre a que tabla pertenece cada campo, le ahorras al gestor el tiempo de localizar a que tabla pertenece el campo. En lugar de SELECT Nombre, Factura FROM Clientes, Facturacion WHERE IdCliente = IdClienteFacturado, usa: SELECT Clientes.Nombre, Facturacion.Factura WHERE Clientes.IdCliente = Facturacion.IdClienteFacturado.
Campos de Filtro
Se procurar elegir en la clusula WHERE aquellos campos que formen parte de la clave del fichero por el cual interrogamos. Adems se especificarn en el mismo orden en el que estn definidos en la clave. Interrogar siempre por campos que sean clave. Si deseamos interrogar por campos pertenecientes a ndices compuestos es mejor utilizar todos los campos de todos los ndices. Supongamos que tenemos un ndice formado por el campo NOMBRE y el campo APELLIDO y otro ndice formado por el campo EDAD. La sentencia WHERE NOMBRE='Juan' AND APELLIDO Like '%' AND EDAD = 20 sera ms optima que WHERE NOMBRE = 'Juan' AND EDAD = 20 por que el gestor, en este segundo caso, no puede usar el primer ndice y ambas sentencias son equivalentes por que la condicin APELLIDO Like '%' devolvera todos los registros.
Orden de las Tablas Cuando se utilizan varias tablas dentro de la consulta hay que tener cuidado con el orden empleado en la clusula FROM. Si deseamos saber cuantos alumnos se matricularon en el ao 1996 y escribimos: FROM Alumnos, Matriculas WHERE Alumno.IdAlumno = Matriculas.IdAlumno AND Matriculas.Ao = 1996 el gestor recorrer todos los alumnos para buscar sus matriculas y devolver las
Estndares de Programacin SQL Server Matricula de Acdemias
17
Fecha: 12/01/2011
correspondientes. Si escribimos FROM Matriculas, Alumnos WHERE Matriculas.Ao = 1996 AND Matriculas.IdAlumno = Alumnos.IdAlumnos, el gestor filtra las matrculas y despus selecciona los alumnos, de esta forma tiene que recorrer menos registros.
5. SEGURIDAD
5.2 Integridad
La integridad referencial ser manejado a travs de constraints Primary Key y Foreign Keys. Los triggers debern ser utilizados solo en caso que se quiera hacer alguna accin en cascada sobre la integridad referencial o cuando se quiera evitar que una clave primaria sea modificada o si la funcionalidad del aplicativo asi lo requiere, tomando en cuenta que el uso de los mismos degrada segn sea el caso la velocidad de actualizacin de las tablas. En caso se requieran hacer validaciones sobre columnas se deber utilizar el constraint del tipo CHECK en vez de crear RULES, salvo que se quiera hacer una validacin de un USER DEFINED DATATYPE. La propiedad Identity puede ser usada para mantener Integridad de Entidad. 18