Necesito una mano para crear tablas de Firebird

365 views
Skip to first unread message

ultraton500

unread,
Nov 11, 2012, 8:21:36 PM11/11/12
to publice...@googlegroups.com
Qué tal amigos del foro,
al crear campos de una tabla de Firebird empezaron a surgirme algunas dudas como

- cuál es la longitud máxima para los nombres de campos, he visto hasta 16 pero nada de info concreta.

- qué tipo de datos usar para un campo id (SMALLINT,INTEGER,NUMERIC), mas puntualmente cuántos dígitos admite cada uno. Encontré los límites pero no están expresados en caracteres o dígitos. Por ej. "SMALLINT: Entero de 16 bits ( -32.768 hasta 32.767 )". Por lo que entendí el nro. de dígitos va a depender del nro. de bytes que ocupa cada dígito según la codificación que se use.
De todas formas para cualquiera de ellos obtengo, en SQL Manager, el error "Precompiler Error: Syntax error - C." luego de aceptar si está tildado el check de Autoincremental en la ventana "Add new field" o "Edit file". Sobre este error no pude encontrar información.

- Entre CHAR y VARCHAR cuál es el que ocupa un espacio fijo en disco y cuál es el que ocupa solo lo necesario para guardar los caracteres ingresados. Al buscar encontré que VARCHAR solo ocupa lo necesario, pero también decían lo mismo para CHAR y por lo tanto sigo con la duda.

- Por último, qué tipo de campo usar como "memo".

Les agradeceré sus comentarios para así poder continuar.
Saludos cordiales,
Javier.

Walter R. Ojeda Valiente

unread,
Nov 11, 2012, 10:44:32 PM11/11/12
to publice...@googlegroups.com
Hola Javier

Paso a responder tus preguntas:

1. La longitud máxima para los nombres de columnas (o campos) es de 28. Ese mismo límite lo tienes para los nombres de los dominios, de las tablas, de los procedimientos almacenados, de los triggers, etc. Tengo entendido que en la siguiente versión de Firebird, la 3.0, se ampliará hasta 64 pero lo sabremos con certeza recién cuando salga la versión Alfa, muy probablemente este mismo año.

2. La cantidad de valores admisibles en los tipos de datos numéricos enteros está expresada en bytes. Por ejemplo, SMALLINT (entero pequeño) admite 2 elevado a la 16, o sea 65536, valores distintos. Como la mitad son negativos y la otra mitad son positivos los valores posibles van desde el -32768 hasta el 32767 más el 0. Para una columna autoincremental yo siempre uso BIGINT porque tengo un dominio llamado D_IDENTIFICADOR que lo engloba. En realidad podrías usar también INTEGER si lo deseas, debería funcionar.

3. CHAR ocupa un espacio fijo en el disco. VARCHAR ocupa un espacio variable, que es la cantidad de caracteres ingresados más uno. Ese uno de más corresponde al caracter CHR(0) el cual marca el final de las cadenas en el Lenguaje C. Debes definir una columna como CHAR cuando se cumpla al menos una de estas condiciones:
   a. Sabes que todos o casi todos los valores tendrán una longitud fija. Por ejemplo, Número del Documento de Identidad, Abreviatura del Estado o Provincia, Estado Civil, Sexo, etc.
   b. Quieres indexar la tabla según esa columna
Debes definir una columna como VARCHAR cuando:
   a. Puede haber muchos espacios en blanco a la derecha del valor introducido, por ejemplo: Nombre, Apellido, Dirección, Email, Descripción, etc.
   b. No indexarás la tabla por esa columna
   c. La longitud será igual o menor a 32767
Debes definir una columna como BLOB SubTipo 1 (equivalente a los campos memo del Visual FoxPro) cuando:
   a. La longitud será (o podría ser en algún caso) mayor que 32767 y,
   b. No indexarás la tabla por esa columna

Saludos.

Walter.

"Si puedes razonar con gente religiosa, no son gente religiosa". Dr. House




Date: Sun, 11 Nov 2012 17:21:36 -0800
From: ultra...@gmail.com
To: publice...@googlegroups.com
Subject: [vfp] Necesito una mano para crear tablas de Firebird
--
 
 
 

Walter R. Ojeda Valiente

unread,
Nov 11, 2012, 11:23:33 PM11/11/12
to publice...@googlegroups.com
Como corolario:

- Si la cantidad de caracteres será fija o casi fija, o si necesitas indexar la columna, usa CHAR

- Si la cantidad de caracteres será variable y menor o igual que 32767 y no necesitas indexar la columna, usa VARCHAR

- Si la cantidad de caracteres será variable y mayor que 32767 y no necesitas indexar la columna, usa BLOB SubTipo 1.


Saludos.

Walter.

"Si puedes razonar con gente religiosa, no son gente religiosa". Dr. House




From: wr...@hotmail.com
To: publice...@googlegroups.com
Subject: RE: [vfp] Necesito una mano para crear tablas de Firebird
Date: Mon, 12 Nov 2012 03:44:32 +0000
--
 
 
 

Guillermo MDQ

unread,
Nov 12, 2012, 9:56:08 AM11/12/12
to publice...@googlegroups.com
Walter te hago una consulta sobre el ejemplo que le diste a Ultraton.
Dices que debe utilizar el tipo de columna VARCHAR para datos como Nombre y Apellido y que no se deba indexar esa columna.
Pero no es precisamente el dato Apellido y Nombre uno de los mas comunes en donde se hace una busqueda alfabetica y por ese motivo se debería indexar ?

Saludos
Guillermo

Jhonny Zambrana

unread,
Nov 12, 2012, 10:33:57 AM11/12/12
to publice...@googlegroups.com
Guillermo creo que lo plantea como alternativa a la descicion de quien pregunto, dice, "Si vas a usar... y NO lo INDEXARAS", creo que es sugerente y no impositivo con respecto del nombre de los campos.
 
Un abrazo y que esten bien.

Walter R. Ojeda Valiente

unread,
Nov 12, 2012, 11:29:56 AM11/12/12
to publice...@googlegroups.com
Guillermo, muy buena pregunta.

Sí, se puede indexar sin problemas una columna VARCHAR, el Firebird te permitirá indexarla, no te mostrará advertencias y te funcionará perfectamente.

Lo que sucede es que cuando hay muchas filas se torna ineficiente, sobre todo cuando tu índice está compuesto por 2 ó más columnas. Como es difícil que alguien recuerde que ese es el problema cuando tiene millones y millones de filas, es que le aconsejo que si quiere indexar una columna que la defina como CHAR, ya que en este caso siempre es rapidísimo (aunque claro, ocupará más espacio en el disco duro).

Pero si la cantidad de filas se encuentra dentro de un margen razonable (digamos menos que 1.000.000), indexar una columna VARCHAR está ok.


Saludos.

Walter.

"Si puedes razonar con gente religiosa, no son gente religiosa". Dr. House




Date: Mon, 12 Nov 2012 06:56:08 -0800
From: gol...@gmail.com
To: publice...@googlegroups.com
Subject: Re: [vfp] Necesito una mano para crear tablas de Firebird
--
 
 
 

ultraton500

unread,
Nov 13, 2012, 2:55:02 PM11/13/12
to publice...@googlegroups.com
Hola Walter, la única pregunta que tenía al respecto ya fue hecha por Guillermo, asi que no me queda nada mas que darte las gracias por tu, como siempre, tan clara explicación y perdón por demorarme en contestar.
Saludos,
Javier.

El lunes, 12 de noviembre de 2012 01:23:36 UTC-3, Walter R. Ojeda Valiente escribió:

Guillermo MDQ

unread,
Nov 13, 2012, 3:15:09 PM11/13/12
to publice...@googlegroups.com
Como la cantidad de espacio en disco ya no es un problema en estos tiempos, me parece que la mejor opcion para guardar los datos Apellido y Nombre es en una columna CHAR, asi se puede indexar y la perfomance es mucho mejor.

Saludos
Guillermo

Walter R. Ojeda Valiente

unread,
Nov 13, 2012, 6:14:05 PM11/13/12
to publice...@googlegroups.com
Es exacto.


Saludos.

Walter.

"Si puedes razonar con gente religiosa, no son gente religiosa". Dr. House




Date: Tue, 13 Nov 2012 12:15:09 -0800
From: gol...@gmail.com
To: publice...@googlegroups.com
Subject: Re: [vfp] Necesito una mano para crear tablas de Firebird
--
 
 
 

mpulla

unread,
Nov 13, 2012, 7:23:32 PM11/13/12
to publice...@googlegroups.com

Hola Guillermo.

El problema de espacio en disco no es un problema, pero mientras más grande la columna a indexar consume más memoria, índice grandes menor rendimiento, no he trabajado en ambientes exigentes, pero en algún momento lo vas a sentir en pequeña o menor escala.

Saludos.
Mauricio

Guillermo MDQ

unread,
Nov 14, 2012, 8:19:19 AM11/14/12
to publice...@googlegroups.com
Y si, es correcto, por eso se debera considerar en cada caso en particular que es lo que conviene haciendo un estimativo de la cantidad de registros que se podran llegar a tener y la frecuencia de actualizacion de la tabla y sus indices.

Saludos
Guillermo
Reply all
Reply to author
Forward
0 new messages