2009-09-24 15 views
7

Si conozco el formato correcto de los campos, ¿debo crear restricciones de verificación para todos esos campos, o esto afectará demasiado el rendimiento de las inserciones/actualizaciones? ¿Sería una buena idea usar expresiones regulares para reglas complejas, o debería usar restricciones simples como mayúsculas y minúsculas?¿Deberían todos los campos en una base de datos Oracle tener una restricción de verificación si es posible?

Los campos ya están siendo validados en el nivel de aplicación.

Respuesta

9

En general, es mejor no confiar en la aplicación y utilizar las restricciones de verificación. Los datos deben mantener la integridad (quién sabe qué secuencia de comandos incorrecta puede ejecutar, o qué error del programa puede pasar).

Sin embargo, si tiene muchas restricciones de verificación complejas y nota una desaceleración de inserción/actualización, es posible que desee volver a evaluar. ¿Es realmente necesario tener uno en cada campo? No. El tipo de datos y la longitud de la columna también actúan como restricciones.

1

Esto depende de su nivel de paranoia.

Por supuesto, las comprobaciones dobles son mejores que las comprobaciones simples, pero la comprobación en el lado del cliente tiene el beneficio o la paralelización.

Las comprobaciones del lado del cliente son realizadas por muchas, posiblemente miles de computadoras que usan sus clientes, mientras que las comprobaciones del lado del servidor las realiza el servidor único.

acabo de correr una prueba en mi Oracle 10g:

CREATE TABLE t_check (value VARCHAR2(50) NOT NULL, CHECK(REGEXP_LIKE(value, '^[0-9]{1,10}$'))) 

INSERT 
INTO t_check 
SELECT level 
FROM dual 
CONNECT BY 
     level <= 1000000 

Con un CHECK, este tiene una duración de 27 segundos, sin uno, pero que se necesita 2 segundos.

Si esto es un problema para usted y si está absolutamente seguro de que nunca ingresará ningún valor en su base de datos a menos que sea verificado por el software del cliente, confíe en el lado del cliente.

1

"Esto depende de su nivel de paranoia.

Por supuesto dobles comprobaciones son mejores que los controles individuales, pero la comprobación en el cliente tiene el beneficio o la paralelización. Se realizan

cheques lado del cliente por muchos, posiblemente miles de computadoras que usan sus clientes, mientras que las comprobaciones del lado del servidor las realiza el servidor único ".

Si bien nada de esto es falso en sí mismo, esta respuesta parece enfatizar desproporcionadamente la importancia de esos 25 segundos, y por lo tanto parece más bien sesgada hacia "confiar en los clientes". Eso es imprudente, punto. Especialmente si el costo de un total de un millón de insertos es tan insignificante como 25 segundos. Nunca se sabe con certeza si TODOS los clientes implementarán correctamente todos los controles necesarios, e incluso si SÍ lo saben, para los clientes que EXISTEN ACTUALMENTE, incluso entonces no conocen a ningún otro cliente futuro.

Lo que debe considerar es el costo de reparación en el que incurrirá cuando sus datos se "corrompan" como consecuencia de alguna restricción que el sistema de bases de datos no aplicó. Por ejemplo, reflexione si el "tipo pobre" que tuvo que resolver el siguiente problema (Find GUID in database), se haría en 25 segundos.

Si la suma total de tiempo necesario para hacer todo el comprobación de restricciones hace que sus transacciones notablemente más lentas, incluso entonces es probable que sea más conveniente para tratar de convencer a su organización de invertir en más o más rápido de hardware.

Los datos que garanticen la satisfacción de las reglas de integridad son el activo más importante en la mayoría de las empresas hoy en día, y deben apreciarse como tales.

+0

"Eso no es prudente, punto, especialmente si el costo de un total de un millón de insertos es tan insignificante como 25 segundos". Eso depende de la frecuencia con la que insertes un millón de registros, ¿verdad? Quassnoi señala que bajo ciertas circunstancias puede considerar no usar una restricción de verificación. Punto válido en mi humilde opinión. –

+0

También depende del grado de control y responsabilidad que tenga sobre el software del cliente. Si usted es el dba que es responsable de la integridad total de los datos, pero no tiene control sobre lo que hacen las aplicaciones del cliente, entonces no tiene más remedio que ser paranoico y hacer cumplir cada regla que, si se rompe, se identificará el id. tomado como una falla para evitar la corrupción de datos. –

+0

Si, por otro lado, escribe todas las aplicaciones así como también la base de datos, entonces depende de usted hacer cumplir las reglas, o posiblemente en ambos lugares. Una regla que casi siempre uso para hacer cumplir en ambos lugares es la regla no nula. No debería tomar un viaje redondo al servidor para descubrir que faltan algunos datos requeridos. Pero tampoco cuesta casi nada comprobarlo a nivel de la base de datos. –

-1

Realmente depende de su arquitectura general. Si su base de datos se usa estrictamente como un almacén de datos, entonces no debería haber controles en la base de datos.

El hecho de que haga esta pregunta sugiere que está utilizando la base de datos de una manera más tradicional. En ese caso, generalmente es mejor agregar tantas restricciones en la base de datos como sea posible, luego haga un perfil para ver cuáles se deben eliminar para mejorar el rendimiento (momento en el que debe decidir si el aumento del rendimiento vale la reducción de la seguridad).

+0

¿Querías decir doblemente negativo? "Si su base de datos se usa estrictamente como un almacén de datos, entonces no debería haber verificaciones en la base de datos." – APC

7

Los puntos de Quassnoi con respecto son válidos, pero vale la pena recordar que no todas las restricciones CHECK son iguales. En las siguientes pruebas, comparé el control REGEXP_LIKE() con otros dos controles "anticuados"; el primero convierte el valor en una cadena de ceros y luego realiza una comprobación de igualdad, y el segundo hace una comprobación de rango usando BETWEEN().

Las pruebas de "Reloj de pared" son sensibles a las condiciones ambientales (como el disparo de un punto de control), por lo que debemos ejecutarlas varias veces. Otra cosa a tener en cuenta es que el rendimiento puede variar de una versión a otra. Por ejemplo, estoy ejecutando 11g y la comprobación de expresiones regulares se ejecutó consistentemente en 9-10 segundos, lo que sugiere que Oracle lo ha optimizado considerablemente desde 10g. Por otro lado, las inserciones sin marcar se ejecutaron en 1.7 - 2 segundos ish, por lo que la expresión regular sigue siendo relativamente cara. El resto de los controles pesa alrededor de 2.5 - 3.0 segundos, lo que representa aproximadamente un 50% de integridad.

Si vale la pena pagar ese peaje realmente depende de cómo se siente acerca de sus datos. La experiencia dice que confiar en el cliente para hacer cumplir las reglas de datos significa inevitablemente que en algún punto las reglas se romperán. Ya sea porque un desarrollador omite aplicarlos o los elimina de la aplicación. O porque alguien adjunta a la base de datos una nueva aplicación cliente (por ejemplo, carga por lotes, servicio web) que no incluye esas reglas.

Por último, la mayoría de las aplicaciones no van a cargar un millón de filas a la vez. En comparación con el viaje de ida y vuelta de la red, los microsegundos requeridos para aplicar cheques a una sola inserción o carga son probablemente una carga trivial.

SQL> CREATE TABLE t_check (value VARCHAR2(50)) 
    2/

Table created. 

Elapsed: 00:00:00.01 
SQL> 
SQL> INSERT 
    2 INTO t_check 
    3 SELECT level 
    4 FROM dual 
    5 CONNECT BY 
    6   level <= 1000000 
    7/

1000000 rows created. 

Elapsed: 00:00:01.68 
SQL> 
SQL> prompt Regex check 
Regex check 
SQL> 
SQL> drop table t_check 
    2/

Table dropped. 

Elapsed: 00:00:00.37 
SQL> CREATE TABLE t_check (value VARCHAR2(50) NOT NULL 
    2  , CHECK(REGEXP_LIKE(value, '^[0-9]{1,10}$'))) 
    3/

Table created. 

Elapsed: 00:00:00.07 
SQL> 
SQL> INSERT 
    2 INTO t_check 
    3 SELECT level 
    4 FROM dual 
    5 CONNECT BY 
    6   level <= 1000000 
    7/

1000000 rows created. 

Elapsed: 00:00:09.53 
SQL> 
SQL> prompt old fashioned "mask" check 
old fashioned "mask" check 
SQL> 
SQL> drop table t_check 
    2/

Table dropped. 

Elapsed: 00:00:00.59 
SQL> CREATE TABLE t_check 
    2  (value VARCHAR2(50) NOT NULL 
    3   , CHECK(translate(lpad(value, 20, '0') 
    4    , '1234567890', '0000000000') = '00000000000000000000')) 
    5/

Table created. 

Elapsed: 00:00:00.01 
SQL> 
SQL> INSERT 
    2 INTO t_check 
    3 SELECT level 
    4 FROM dual 
    5 CONNECT BY 
    6   level <= 1000000 
    7/

1000000 rows created. 

Elapsed: 00:00:02.82 
SQL> 
SQL> prompt old fashioned "range" check 
old fashioned "range" check 
SQL> 
SQL> drop table t_check 
    2/

Table dropped. 

Elapsed: 00:00:00.39 
SQL> CREATE TABLE t_check 
    2  (value VARCHAR2(50) NOT NULL 
    3   , CHECK(value between 1 and 1000000)) 
    4/

Table created. 

Elapsed: 00:00:00.01 
SQL> 
SQL> INSERT 
    2 INTO t_check 
    3 SELECT level 
    4 FROM dual 
    5 CONNECT BY 
    6   level <= 1000000 
    7/

1000000 rows created. 

Elapsed: 00:00:02.23 
SQL> 
+4

"Finalmente, la mayoría de las aplicaciones no van a cargar un millón de filas a la vez ..." Muy bien: imagínense carga 1 millón de filas por año, claramente no vale la pena arriesgar la integridad de los datos para ahorrar 27 segundos repartidos en un año. –

+5

Las aplicaciones que cargan un millón de registros a la vez son las que más necesitan las restricciones de verificación porque esas importaciones probablemente no provengan de la aplicación sino de una aplicación ETL. Sin restricciones, es muy fácil cargar datos incorrectos ya que es menos probable que los especialistas de ETL conozcan las reglas de negocio de la aplicación que deberían aplicarse. – HLGEM

-1

Mi verdadera pregunta es, ¿pueden los datos ingresar a su base de datos desde una fuente que no sea la aplicación? ¿Habrá grandes importaciones o consultas que se ejecutarán desde otras aplicaciones o desde una ventana de consulta? Si tiene un nuevo cliente que desea importar registros de su proveedor anterior, ¿cómo se manejará? Si puede concebir alguna razón por la cual los datos pueden ser cambiados desde fuera de la aplicación y las reglas deben aplicarse para todos los datos, entonces necesita restricciones de verificación o factores desencadenantes para hacer cumplir eso. ¿Qué tan importante es el formato para el funcionamiento del resto de la aplicación? Por ejemplo, si almacena todos los números de teléfono como números únicos y agrega el formato en la página que muestra los datos, ¿cuál será el efecto si alguien agrega un número de teléfono (111) 111-1111 a su información mostrada? La integridad de los datos es una parte fundamental de las bases de datos.Si no puede confiar en que los datos estén en el formato correcto o sigan las reglas correctas (solo tres valores correctos para un campo, por ejemplo), entonces su dqata se vuelve menos valiosa. Dependiendo de la gravedad, podría ser una falla crítica.

Otra cosa a considerar es ¿hay personas que puedan acceder directamente a las tablas que no son administradores? Si es así, las reglas aplicadas a nivel de la base de datos pueden ayudar a reducir la posibilidad de fraude. (El desarrollador a menudo olvida proteger los datos de usuarios autorizados. Las reglas de las que estoy hablando aquí se aplican con desencadenantes más que simples restricciones de verificación, excepto posiblemente límites máximos en las tarifas, pero es algo a tener en cuenta al diseñar la base de datos)

0
  1. La diferencia de velocidad depende en gran medida de su hardware - procesadores más rápidos, memoria, discos, e incluso la liberación de base de datos puede afectar a las restricciones/sin relación limitaciones de tiempo. Veo una gran diferencia en números (porcentaje sabio) en diferentes combinaciones de hardware-os. Así que la respuesta correcta es probar su implementación específica con y sin constantes, y comparar el costo con el soporte de la mesa de ayuda o la limpieza de datos para corregir "datos incorrectos", o ambos.

  2. Si alguna vez se le asignó migrar los datos de la base de datos donde todas las restricciones se "implementaron en el lado del cliente", se convertiría rápidamente en verdadero fiel en la implementación de constantes constantes en el servidor.

  3. Sería extremadamente peligroso creer que tendrá que ocuparse solo de una aplicación que use sus datos y todos usarán las mismas "restricciones". Pero incluso en este caso, diferentes desarrolladores tienen diferentes conocimientos y con el envejecimiento de la aplicación y el flujo de defelopers, los nuevos desarrolladores pueden no saber nada sobre algunas limitaciones ocultas en años de desarrollo de código.

Así, en otras palabras, cuando el diseño piensan "¿por qué no necesitamos esta restricción" en lugar de "por qué la necesitamos" y la prueba es el rey.

Cuestiones relacionadas