Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo Hace 4 Días
manelb manelb is offline
Miembro
 
Registrado: mar 2017
Posts: 289
Poder: 8
manelb Va por buen camino
Tablas con PKs Negativas

Tenemos un ERP al que estamos haciendo algunas ampliaciones y vamos a conectar a través de un sistema REST con una aplicación de terceros para poder añadir movimientos desde el exterior.

En nuestro sistema todas las tablas disponen de un ID que se autoalimenta a partir de generadores propios para cada una de las tablas.
Tenemos un Generador para cabeceras de albaranes, otro para líneas de albaranes, y así con todas las tablas.

Los registros que nos llegan a través de las peticiones REST tienen su propio ID y debemos asegurarnos de que no vamos a tener colisiones con IDs duplicados.
Estos registros pueden ser de alta, de modificación o de borrado, por lo que es necesario conservar de alguna forma el ID original.

Para solucionar el problema se me ocurren varias opciones.
1.- Tener un rango diferente de IDs para los movimientos externos.
Por ejemplo sumar 10.000.000 al ID original (no garantiza al 100% las colisiones)
2.- Conservar los IDs originales pero con signo negativo
3.- Añadir un campo a la tabla con el ID Externo.
4.- Una tabla intermedia que me relacione el ID externo con mi ID.

De todas estas opciones me decanto absolutamente por la de IDs negativos ya que, claramente, es la que representa menos trabajo y creo que es la más eficiente.

La pregunta:
Puedo tener algún problema en Firebird por el hecho de tener IDs, PKs, FKs con valores negativos.
He estado haciendo algunas pruebas y todo parece funcionar correctamente, pero desearía saber si alguien ha tenido alguna experiencia en este sentido.

Gracias por vuestros comentarios
Responder Con Cita
  #2  
Antiguo Hace 4 Días
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.938
Poder: 27
delphi.com.ar Va por buen camino
Lo mas normal en esos casos, es que el modelo de datos del servidor, incluya en un campo la referencia al ID del registro del cliente, junto con el ID del cliente, y crear una clave única entre dos campos para evitar que un registro se inserte mas de una vez. Algo como tu punto 3.
En relación a tu pregunta, desconozco FireBird, pero la exigencia normal de los motores RDBMS suele ser que los campos que conforman la relación entre ambas tablas, conserven el mismo tipo de dato, sin importar el contenido.

Saludos.
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #3  
Antiguo Hace 4 Días
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.107
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Creo que lo más coherente es:
3.- Añadir un campo a la tabla con el ID Externo.
Responder Con Cita
  #4  
Antiguo Hace 3 Días
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.339
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por manelb Ver Mensaje
Para solucionar el problema se me ocurren varias opciones.
1.- Tener un rango diferente de IDs para los movimientos externos.
Por ejemplo sumar 10.000.000 al ID original (no garantiza al 100% las colisiones)
2.- Conservar los IDs originales pero con signo negativo
3.- Añadir un campo a la tabla con el ID Externo.
4.- Una tabla intermedia que me relacione el ID externo con mi ID.

Yo creo que también me decantaría por la 3.
1) Mezclas "cosas diferentes" en un sólo campo; Se me ocurren problemas como que puedan coincidir los rangos o que tengas que hacer JOIN contra tablas diferentes por el mismo campo,...
2) (entiendo que los conservas en el mismo campo cambiando los actuales). Lo mismo de antes en el mismo campo guardas cosas diferentes. No se qué pasará si ya estás haciendo referencia a esos ID's en otros lugares. Código condicional dependiendo de si el valor de un campo es positivo o negativo. raro...
3) Creo que es la correcta. Normalizada y la más clara.
4) Sería la escogida si la relación entre ID/IDExterno fuera 1..N; Si la relación es 1..1, 1..0 se puede usar esta o la anterior.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #5  
Antiguo Hace 2 Días
manelb manelb is offline
Miembro
 
Registrado: mar 2017
Posts: 289
Poder: 8
manelb Va por buen camino
Hola compañeros....

Muchas gracias por vuestras aportacions.

Veo que además estais deacuerdo en la solución a adoptar.

Lo comentamos con el equipo y tomaremos una decisión

Saludos a todos
Responder Con Cita
  #6  
Antiguo Hace 2 Días
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.744
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
También voto por la opción 3, aunque si por algún motivo no puedes agregar el campo, una tabla de relación es la solución.
En este último caso, no tienes que modificar la estructura original.
Además, si luego tienes mas de un origen de importaciones, puedes tener una tabla como esta:

Código SQL [-]
Create Table RelacionOrigenesExteriores(
Tipo varchar(3)
Origen varchar(10)
IdOrigen integer
IdPropio integer
FechaUltimaSincronizacion date
)
Código:
Tipo  Origen        IdOrigen IdPropio FechaUltimaSincronizacion
'FAC' 'ODOO'           123      456       01/01/2024 12:34:56
'PED' 'PRESTASHOP'     789      457       01/01/2024 12:34:56
'PED' 'WORDPRESS'      224      458       01/01/2024 12:34:56
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Tablas con IBX servicomp Firebird e Interbase 2 05-07-2010 17:51:11
Tablas ADO brakaman Tablas planas 10 08-04-2007 22:54:52
tablas en sql server demasiadas tablas yeison Cristman SQL 8 10-08-2006 16:26:36
Tablas Dbf keys Conexión con bases de datos 2 03-11-2005 09:32:57
Dll con tablas brandolin OOP 1 19-08-2003 16:12:07


La franja horaria es GMT +2. Ahora son las 23:26:22.


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
Copyright 1996-2007 Club Delphi