En Firebird se llama dominio a los tipos de datos creados por el programador, no son los tipos de datos estándar sino los creados por el programador para cubrir sus propias necesidades.

Cuando se crea una tabla se debe decidir el nombre que tendrá cada columna y el tipo de dato que podrá guardarse en esa columna.

Por ejemplo, si queremos guardar números enteros en una columna, el tipo de datos de esa columna puede ser INTEGER. Si queremos guardar nombres de personas el tipo de datos de esa columna será CHAR o VARCHAR. Si queremos guardar fechas, el tipo de dato será DATE o TIMESTAMP, etc.

Un dominio siempre está basado en un tipo de datos estándar pero restringe o limita de alguna manera a ese tipo de dato estándar, obteniéndose así un nuevo tipo de dato más acorde a lo que el programador necesita.

Por ejemplo, supongamos que en una columna queremos guardar una «V» (significando verdadero) o una «F» (significando falso). Podríamos crear un dominio como este:

CREATE DOMAIN D_BOOLEAN
AS CHAR(1) CHARACTER SET NONE
   CHECK (VALUE = 'V' OR VALUE = 'F');

En este ejemplo nuestro dominio se llama D_BOOLEAN y las columnas que usen este dominio solamente aceptarán una «V» o una «F», nada más.

Veamos otro ejemplo, sabemos que nuestra empresa empezó sus actividades el día 15/OCT/2012 entonces ninguna operación podría haberse realizado antes de esa fecha: ni compras, ni ventas, ni cobranzas ni pagos, ni nada de nada porque antes de esa fecha la empresa no existía. Por lo tanto, para evitar errores podríamos definir un dominio como el siguiente:

CREATE DOMAIN D_FECHA_INICIAL
AS DATE
   CHECK (VALUE >= '2012/10/15');

Y todas las columnas cuyo tipo de datos sea el dominio D_FECHA_INICIAL solamente aceptarán la fecha 15/10/2012 o posteriores, cualquier intento de introducir una fecha anterior fracasará y la fila no será insertada dentro de la tabla.

Aunque supongo que ya sabes lo que es un dominio y para que se utiliza, agregaré otro ejemplo. Todos los precios de los productos que vendemos son siempre positivos, es imposible que el precio de un producto sea cero o sea negativo. Para asegurarnos que a ningún «brillante» operador se le ocurra ponerle un precio negativo podríamos tener un dominio como este:

CREATE DOMAIN D_PRECIO1
AS DECIMAL(10, 2)
   CHECK (VALUE > 0);

El cual nos asegurará que jamás se grabe ni un cero ni un precio negativo en esa columna.

Desde luego que la condición del CHECK puede ser más complicada. Si por ejemplo sabemos que la calificación de un alumno no puede ser menor que 0 ni mayor que 100 nuestro dominio podría ser algo así:

CREATE DOMAIN D_CALIFICACIONES
AS SMALLINT
   CHECK (VALUE >= 0 AND VALUE <= 100);

y así nos aseguraremos que ningún alumno tenga una calificación negativa ni una calificación mayor que 100.

Como los dominios son de tanta ayuda para el programador, todos los buenos programadores usan dominios en todas las columnas de todas las tablas, sin excepción. Así que un parámetro que puedes usar para saber que tan bueno es un programador es ese, mira cuantos dominios usa en sus tablas: ningún dominio o pocos dominios, es flojo, flojo, flojo; muchos dominios, es bastante bueno; solamente usa dominios y jamás tipos de datos estándar, es muy bueno programando.

Resumiendo:

  • Los dominios son tipos de datos creados por el programador
  • Están basados en los tipos de datos estándar
  • Restringen, limitan, disminuyen a los tipos de datos estándar
  • Son muy útiles porque evitan que se introduzcan datos erróneos en las columnas
  • Los buenos programadores siempre usan dominios en todas las columnas de todas las tablas