Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Correcta eleccion del primary key (https://www.clubdelphi.com/foros/showthread.php?t=53502)

brandolin 22-02-2008 06:57:10

Correcta eleccion del primary key
 
A ver, creo que ese no es el titulo correcto pero no encuentro otro. Paso a explicar el problema.

Tengo una tabla de facturas donde el primary key deberia ser el numero de factura (por ej: 0001-12345678) la idea era ponerlo a todo ese numero (sin el guin) como in bigint (uso firebird + dbexpress + delphi7) pero resulta que el dbexpress me lo pone como tipo TBCDxxx y no se porque no me deja asignar valor a dicho campo...
Para evitar esto puse a este campo como varchar(15) pero no me gusta que un varchar sea primary key (creo haber leido un problema de velocidad en la indexacion)
Entonces para evitar esto lo he puesto como float... alli si toma todo el nuemro de corrido es decir 112345678, ahora bien varias preguntas.
1-Es optimo poner un float como primary key ? No se desperdicia espacio sin sentido...
2- y un varchar?
3- si aplico un formatfloat("9999-9999999", 1123456789) me devolvera 0001-12345678 ?
4- Alguno otro consejo de diseño ?

desde ya muchas gracias

marcoszorrilla 22-02-2008 07:16:52

Debes descartar usar un Float como clave primaria.

La opción Varchar(15), a mi juicio es la correcta.

Un Saludo.

brandolin 22-02-2008 07:29:17

y poner el varchar(15) como primary key ?

Al González 22-02-2008 08:11:44

Te recomiendo que NO uses ningún campo que represente algo significativo para el usuario como llave primaria. Coloca en cada tabla un campo inicial Integer llamado ID, y usa éste como su llave primaria para relacionar los registros con otras tablas.

Lepe 22-02-2008 12:48:53

Estoy de acuerdo con Al el tipo de numeración de facturas puede cambiar (a mí me pasó :D) y te toca modificar claves primarias, claves ajenas, etc.

Para las facturas uso un campo IdMaestro (PK), para las líneas de factura, IdMaestro (FK) e IdDetalle (PK).

En cuanto al BCD, es Binary Coded Decimal, useasé, si usas un Generador en FB2 se usará internamente un int64 para almacenar el valor, y en delphi se traduce en un TBCDField (Representante del int64 sin pérdida de decimales), Típico también de campos numeric/decimal (x,y) con x>9 que es obligado su uso para cantidades monetarias.

Saludos

duilioisola 22-02-2008 15:50:29

Estoy de acuerdo con lo que dice Al Gonzalez y Lepe.
Utiliza Enteros para identificar a cada registro.

Además quisiera agregar que jamas se deben utilziar campos Float ni campos Date para definir PKs. (Un Date es internamente un float)
Los redondeos en los decimales hará que no siempre encuentres lo que quieres.

brandolin 22-02-2008 18:01:08

Gracias, seguire los consejos.


La franja horaria es GMT +2. Ahora son las 14:06:51.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi