Estandar Base Datos Oracle

33
Nomenclatura Mejores Prácticas * Estándares de Base de Datos Oracle

Transcript of Estandar Base Datos Oracle

Page 1: Estandar Base Datos Oracle

Nomenclatura Mejores Prácticas

* Estándares de Base de Datos Oracle

Page 2: Estandar Base Datos Oracle

*Nomenclatura

NOMENCLATURA DE TABLESPACE

TBSP_<[TBL][IDX]>_<NOMBRE_TABLESPACE>

TBL: TABLA | IDX: INDICEEjemplo:

CREATE TABLESPACE TBSP_TBL_SECURITY

DATAFILE ‘/TBSP_TBL_SECURITY.DBF'

SIZE 500M

EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M

PERMANENT;

Page 3: Estandar Base Datos Oracle

*Nomenclatura

NOMENCLATURA DE TABLA TBL_<NOMBRE_TABLA>

Ejemplo:

CREATE TABLE TBL_GROUP (

GRP_GROUP_CODE NUMBER(18, 0) NOT NULL,

GRP_GROUP_NAME VARCHAR2(50) NOT NULL

)

TABLESPACE TBSP_SECURITY;

Page 4: Estandar Base Datos Oracle

*Nomenclatura

NOMENCLATURA DE CAMPO DE TABLA <INICIALES_NOMBRE_TABLA>_<NOMBRE_CAMPO>

INICIALES DE NOMBRE TABLA: 3 dígitos.

Ejemplo:

CREATE TABLE TBL_GROUP (

GRP_GROUP_CODE NUMBER(18, 0) NOT NULL,

GRP_GROUP_NAME VARCHAR2(50) NOT NULL

)

TABLESPACE TBSP_SECURITY;

Page 5: Estandar Base Datos Oracle

*Nomenclatura

NOMENCLATURA DE VISTA VIEW_<NOMBRE_VISTA>

Ejemplo:

CREATE VIEW VIEW_USER

AS

SELECT USR_USER_FIRSTNAME,

USR_USER_LASTNAME

FROM TBL_USER

WHERE USER_LOGIN = ‘HBRAVO’;

Page 6: Estandar Base Datos Oracle

*Nomenclatura

NOMENCLATURA DE INDICE IDX_<NOMBRE_TABLA>_<NRO_CORRELATIVO>

Ejemplo:

CREATE INDEX IDX_USER_1

ON TBL_USER (

USER_LASTNAME,

USER_FIRSTNAME

)

TABLESPACE TBSP_IDX_SECURITY;

Page 7: Estandar Base Datos Oracle

*Nomenclatura

NOMENCLATURA DE PRIMARY KEY PK_<NOMBRE_TABLA>

Ejemplo:

ALTER TABLE TBL_USER ADD (

CONSTRAINT PK_USER PRIMARY KEY (USER_LOGIN)

);

Page 8: Estandar Base Datos Oracle

*Nomenclatura

NOMENCLATURA DE FOREIGN KEY FK_<NOMBRE_TABLA>_<NRO_CORRELATIVO>

Ejemplo:

ALTER TABLE TBL_USER_GROUP ADD (

CONSTRAINT FK_USER_GROUP_1 FOREIGN KEY (USER_LOGIN) REFERENCES TBL_USER (USER_LOGIN)

);

Page 9: Estandar Base Datos Oracle

*Nomenclatura

NOMENCLATURA DE PAQUETE PKG_<NOMBRE_PAQUETE>

Ejemplo:

CREATE OR REPLACE PACKAGE PKG_SECURITY

AS

END PKG_SECURITY;

CREATE OR REPLACE PACKAGE BODY PKG_SECURITY

AS

END PKG_SECURITY;

Page 10: Estandar Base Datos Oracle

*Nomenclatura

NOMENCLATURA DE TIPO T_<NOMBRE_TIPO>

Ejemplo:

TYPE T_CURSOR IS REF CURSOR;

Page 11: Estandar Base Datos Oracle

*Nomenclatura

NOMENCLATURA DE PROCEDURE PRC_<[S][I][U][D]>_<NOMBRE_PROCEDURE>

S: SELECT | I: INSERT | U: UPDATE | D: DELETE

Ejemplo:

SI ES MUCHOS REGISTROS CON PARAMETROS DE ENTRADA

PROCEDURE PRC_S_USERS_FILTERS();

SI ES MUCHOS REGISTROS SIN PARAMETROS DE ENTRADA

PROCEDURE PRC_S_USERS();

SI ES UN UNICO REGISTRO

PROCEDURE PRC_S_USER();

Page 12: Estandar Base Datos Oracle

*Nomenclatura

NOMENCLATURA DE FUNCION FNT_<NOMBRE_FUNCION>

Ejemplo:

FUNCTION FNT_CALCULATE_AGE()

RETURN NUMBER;

Page 13: Estandar Base Datos Oracle

*Nomenclatura

NOMENCLATURA DE PARAMETRO P_<NOMBRE_CAMPO_TABLA>

P_<NOMBRE_PARAMETRO_AUXILIAR>

P_<NOMBRE_CURSOR>

Ejemplo:

PROCEDURE PRC_S_PARAMETER (

P_PARAMETER_CODE IN TBL_PARAMETER.PARAMETER_CODE%TYPE,

P_CODAUX IN NUMBER,

P_CURSOR OUT T_CURSOR

);

Page 14: Estandar Base Datos Oracle

*Nomenclatura

NOMENCLATURA DE VARIABLE V_<NOMBRE_CAMPO_TABLA>

V_<NOMBRE_VARIABLE_AUXILIAR>

Ejemplo:

PROCEDURE PRC_S_PARAMETER ()

AS

V_PARAMETER_CODE TBL_PARAMETER.PARAMETER_CODE%TYPE;

V_CODAUX NUMBER(3, 0);

BEGIN

END PRC_S_PARAMETER;

Page 15: Estandar Base Datos Oracle

*Nomenclatura

NOMENCLATURA DE SEQUENCE SEQ_<NOMBRE_TABLA>

Ejemplo:

CREATE SEQUENCE SEQ_USER

MIN VALUE 1

START WITH 1

INCREMENT BY 1

NOCACHE;

Page 16: Estandar Base Datos Oracle

*Nomenclatura

NOMENCLATURA DE TRIGGER TRG_<[B][A]>_<[I] OR [U] OR [D]><NOMBRE_TABLA>

B: BEFORE | A: AFTER

I: INSERT | U: UPDATE | D: DELETE

NOTA: EL TRIGGER NO ES RECOMENDABLE USARLO,

SALVO CASOS ESPECIALES QUE SE REQUIERA.

Ejemplo:

CREATE OR REPLACE TRIGGER TRG_A_IU_USER

AFTER INSERT OR UPDATE

ON TBL_USER

FOR EACH ROW

DECLARE

BEGIN

END TRG_A_IU_USER;

Page 17: Estandar Base Datos Oracle

*Mejores Prácticas

ALTERNATIVA PARA EVITAR QUERY DINAMICO USANDO AND Y OR PROCEDURE PRC_EMPLOYEES ( P_EMPLOYEE_NAME VARCHAR2(100), P_DEPARTMENT VARCHAR2(50), P_DESIGNATION VARCHAR2(50), P_START_DATE DATE, P_END_DATE DATE, P_SALARY NUMBER(10, 2))ASBEGIN OPEN P_CURSOR FOR SELECT EMPLOYEE_NAME, DEPARTMENT, DESIGNATION, JOINING_DATE, SALARY FROM TBL_EMPLOYEE WHERE (P_EMPLOYEE_NAME IS NULL OR EMPLOYEE_NAME = P_EMPLOYEE_NAME)

AND (P_DEPARTMENT IS NULL OR DEPARTMENT = P_DEPARTMENT)

AND (P_DESIGNATION IS NULL OR DESIGNATION = P_DESIGNATION)

AND (P_SALARY IS NULL OR SALARY >= P_SALARY)

AND (P_START_DATE IS NULL OR P_END_DATE IS NULL OR (P_START_DATE IS NOT NULL AND P_END_DATE IS NOT NULL AND JOINING_DATE BETWEEN P_START_DATE AND P_END_DATE));END PRC_EMPLOYEES;

Page 18: Estandar Base Datos Oracle

*Mejores Prácticas

USAR EN LO MAYOR POSIBLE SQL ESTANDAREVITAR:

WHERE PAR.APPLICATION_CODE = APP.APPLICATION_CODE

AND PAR.TABLE_CODE(+) = RTA.TABLE_CODE

USAR:

SELECT PAR.PARAMETER_NAME,

APP.APPLICATION_NAME,

RTD.ARGUMENT_VALUE_SECOND,

RTA.TABLE_DESCRIPTION

FROM TBL_PARAMETER PAR

INNER JOIN TBL_APPLICATION APP

ON (

PAR.APPLICATION_CODE = APP.APPLICATION_CODE

)

INNER JOIN TBL_REFERENCE_TABLE_DETAIL RTD

ON (

PAR.PARAMETER_TYPE_CODE = RTD.REFERENCE_CODE

)

LEFT JOIN TBL_REFERENCE_TABLE RTA

ON (

PAR.TABLE_CODE = RTA.TABLE_CODE

);

Page 19: Estandar Base Datos Oracle

*Mejores Prácticas

FORMATEO DE SELECTSELECT PAR.PARAMETER_NAME,

APP.APPLICATION_NAME

FROM TBL_PARAMETER PAR

INNER JOIN TBL_APPLICATION APP

ON (

PAR.APPLICATION_CODE = APP.APPLICATION_CODE

)

WHERE PAR.PARAMETER_CODE = 1

AND APP.APPLICATION_CODE = 1

Page 20: Estandar Base Datos Oracle

*Mejores Prácticas

FORMATEO DE INSERTINSERT INTO TBL_PARAMETER (

PARAMETER_CODE,

PARAMETER_NAME

)

VALUES (

P_PARAMERTER_CODE,

P_PARAMETER_NAME

);

Page 21: Estandar Base Datos Oracle

*Mejores Prácticas

FORMATEO DE UPDATEUPDATE TBL_PARAMETER

SET PARAMETER_CODE = P_PARAMETER_NAME,

PARAMETER_NAME = P_PARAMETER_VALUE

WHERE PARAMETER_CODE = P_PARAMETER_CODE;

Page 22: Estandar Base Datos Oracle

*Mejores Prácticas

FORMATEO DE DELETEDELETE FROM TBL_PARAMETER

WHERE PARAMERTER_CODE = P_PARAMERTER_CODE;

Page 23: Estandar Base Datos Oracle

*Mejores Prácticas

FORMATEO DE PROCEDURESPROCEDURE PRC_S_PARAMETERS (

<PARAMETROS DEL PROCEDURE - OPCIONAL>

)

AS

<VARIABLES DEL PROCEDURE - OPCIONAL>

BEGIN

<CUERPO DEL PROCEDURE: SOLO VA SETENCIAS SIMPLES COMO SELECT, INSERT, UPDATE Y DELETE, NO LOGICA DE NEGOCIO>

END PRC_S_PARAMETERS;

Page 24: Estandar Base Datos Oracle

*Mejores Prácticas

FORMATEO DE FUNCIONESFUNCTION FNT_CALCULATE_AGE (

<PARAMETROS DEL FUNCTION - OPCIONAL>

)

RETURN <TIPO DE DATO DE RETORNO>

AS

<VARIABLES DEL FUNCTION - OPCIONAL>

BEGIN

<CUERPO DEL FUNCTION: LOGICA UTILITARIA>

RETURN <VARIABLE A RETORNAR>;

END FNT_CALC_AGE;

Page 25: Estandar Base Datos Oracle

*Mejores Prácticas

FORMATEO DE PACKAGE

CREATE OR REPLACE PACKAGE PKG_SECURITY

AS

<VARIABLES DEL PACKAGE (CURSOR Y CONSTANTES) - OPCIONAL>

<DEFINICION DE FUNCIONES O PROCEDURES>

END PKG_SECURITY;

CREATE OR REPLACE PACKAGE BODY PKG_SECURITY

AS

<IMPLEMENTACION DE FUNCIONES O PROCEDURES>

END PKG_SECURITY;

Page 26: Estandar Base Datos Oracle

*Mejores Prácticas

DOCUMENTACION DE PACKAGE

Evitar el uso de tildes en la documentación.

/** * Descripcion breve. * @author hbravo * @version 1.0 hbravo 20/02/2009.<br/>1.1 cgavidia 30/11/2009 */

Page 27: Estandar Base Datos Oracle

*Mejores Prácticas

DOC. PROCEDURE Y FUNCTION EN PACKAGE Evitar el uso de tildes en la documentación./* * Descripcion breve. * @param PARAMETRO1 Comentario sobre el parametro. * @param PARAMETRO2 Comentario sobre el parametro. * @return VARCHAR2 Comentario sobre el valor de retorno<Usar solo para funciones>. * @author hbravo * @version 1.0 hbravo 20/02/2009.<br/>1.1 cgavidia 30/11/2009 */

Page 28: Estandar Base Datos Oracle

*Mejores Prácticas

DOC. PROCEDURE Y FUNCTION EN PACKAGENota: Esto es generado con el comando PLDOC.

Ejemplo:/* * Obtiene un listado de usuarios. * @param P_USER_FIRSTNAME Nombre del usuario. * @return INTEGER Ultimo codigo de usuario<Solo en caso de funcion agregarlo>. * @author hbravo * @version 1.0 hbravo 31/12/2011.<br/>1.1 cgavidia 05/01/2012 */

PROCEDURE PRC_S_USERS (….

Page 29: Estandar Base Datos Oracle

*Mejores Prácticas

DOC. PROCEDURE Y FUNCTION EN PACKAGECon Maven:

<dependency>

<groupId>net.sourceforge.pldoc</groupId>

<artifactId>maven-pldoc-plugin</artifactId>

<version>2.0</version>

</dependency>Comandos:

$ pldoc -d <carpetaSalida> -doctitle <TituloDoc> -overview overview.html script*.sql

Page 30: Estandar Base Datos Oracle

*Mejores Prácticas

TIPS DE MEJORES PRACTICAS

* Evitar usar arterísco en selección de campos

(SELECT * FROM).

* Evitar alias como A, B, C, etc. Los alias debe ser 3 caracteres que indentifiquen la tabla.

* Evitar usar funciones en la clausula where ya que rompe los índices, aunque Oracle puede crear índices con funciones pero otros motores de BD no lo soportan:

WHERE UPPER(USR_USER_FIRSTNAME) = UPPER(P_USER_FIRSTNAME);

* Evitar usar cálculos en la clausula where ya que rompe los índices:

WHERE SALARY * 5 > P_SALARY;

Page 31: Estandar Base Datos Oracle

*Mejores Prácticas

TIPS DE MEJORES PRACTICAS

* Evitar palabras reservadas en los nombres de objetos de Base de Datos.

* Colocar índices solo a las tablas que almacenarán un gran volumen de registros y que son consultadas frecuentemente.

* Los parámetros que están relacionados con campos de tablas deben usar %TYPE con su tabla maestra:

P_PARAMETER_CODE IN TBL_PARAMETER.PARAMETER_CODE%TYPE

* Evitar usar en lo mayor posible la clausula LIKE solo en casos necesarios usarlo, debería usar igualdad.

* Al crear las tablas de base de datos los tipos numéricos deben ser NUMBER, y los tipos fecha DATE y TIMESTAMP según lo requiera.

* La longitud máxima de los objetos de Base de Datos debe ser de 30 caracteres.

Page 32: Estandar Base Datos Oracle

*Mejores Prácticas

TIPS DE MEJORES PRACTICAS

* Evitar usar las clausulas IN, NOT IN, EXISTS, NOT EXISTS en las clausulas WHERE; ya que disminuyen rendimiento, estos pueden ser reemplazados usando las clausulas JOIN. Solo usar IN y NOT IN con valores constantes y no con subquerys. Por ejemplo:

SELECT USR.USR_USER_FIRSTNAME // SENTENCIA INCORRECTA FROM TBL_USER USR WHERE EXISTS (  SELECT *       FROM TBL_LOG LOG       WHERE USR.USR_USER_CODE = LOG.LOG_USER_CODE    )

SELECT USR.USR_USER_FIRSTNAME // SETENCIA CORRECTA FROM TBL_USER USR

INNER JOIN TBL_LOG LOG

ON (

USR.USR_USER_CODE = LOG.LOG_USER_CODE

);

Page 33: Estandar Base Datos Oracle

*Mejores Prácticas

REFERENCIAS Y BIBLIOGRAFIA* http://

stackoverflow.com/questions/227037/can-i-get-better-performance-using-a-join-or-using-exists

* http://social.msdn.microsoft.com/Forums/es/sqlserveres/thread/779a9496-b99a-472d-837d-099215

* http://www.dba-oracle.com/oracle_news/2004_3_8.htm

* http://www.dba-oracle.com/s_sql_best%20practices.htm

* http://www.um.es/atica/como-documentar-el-codigo-pl-sql

* http://mvnrepository.com/artifact/net.sourceforge.pldoc/maven-pldoc-plugin/2.0

* http://pldoc.sourceforge.net/maven-site/