Oracle / MariaDB: buscar un registro en múltiples tablas

Lordnet

Autoridad Ancestral de Transacciones
Se incorporó
11 Junio 2004
Mensajes
2.171
hola, les quiero pedir ayuda con lo siguiente.

supongamos que tenemos 20 tablas, en todas ellas tenemos un campo llamado ID_tran para identificar una transacción.
la grabación en las tablas dependerá del tipo de transacción. el id seria el mismo en cada tabla. la duda en qué tabla(s) se registró.

por lo cual quiero ver una forma sencilla. para que dado un ID_tran específico pueda ver en qué tabla(s) se guardó un nuevo registro.

Se que en oracle tengo una tabla de sistema donde están todas las tablas y campos. supongo que debiese construirlo a partir de eso. o es con algo que te proveea un DBMS (ej: toad/dbeaver).

en mariaDB no se si tenemos algo equivalente. o como se podría abordar (un SP?)

de antemano gracias
 

Kitsune

Fanático
Se incorporó
5 Mayo 2006
Mensajes
1.029
Y no tienes el tipo de transaccion de antemano para saber en que tabla buscar?
¿todos los ids son iguales encuanto a formato? (no hay sufijos/prefijos?)

Si asi es la cosa, pues claro, si las tablas son conocidas hay que buscar en todas poniendolas en una funcion o sp (dependiendo de donde quieras llamar) que haga la busqueda en cada una y te devuelva donde lo encontró. ( hasta una query con coalsce seriviría, )

onda
SELECT
COALESCE(
(SELECT 'tabla1'
FROM tabla1
WHERE id = 1),

(SELECT 'tabla2'
FROM tabla3
WHERE id = 1),

(SELECT 'tabla3'
FROM tabla3
WHERE id = 1)
) AS donde
Entregando el nombre de la primera tabla en donde, según el mismo orden, encontró el ID.

De todas maneras, en mariadb/mysql tambien tienes un information_schema

Si se puede, modificaría el modelo para que todos los id estubiesen en una tabla unica y las otras apunten a ella. Y al guardar la transaccion tambien guardar el dato de la tabla en donde quedo en otro campo y el tipo de transaccion para facilitar las busquedas.

suerte!
 
Upvote 0

Amenadiel

Ille qui nos omnes servabit
Fundador
OVERLORD
REPORTERO
Se incorporó
15 Enero 2004
Mensajes
18.398
Si tus ID son únicos a nivel de BBDD (por ejemplo usando UUID o ULID) bastaría con hacer una vista

SQL:
CREATE OR REPLACE VIEW vw_transacciones AS
SELECT ID_tran, 1 as tipo_tran  'tabla1' as tabla, tabla1.* from tabla1
UNION ALL
SELECT ID_tran, 2 as tipo_tran, 'tabla2' as tabla, tabla2.* from tabla2
UNION ALL
SELECT ID_tran, 3 as tipo_tran, 'tabla3' as tabla, tabla3.* from tabla3

Ahora, si tú dices que el tipo de transacción determina dónde va a parar el registro, significa que parte de la integridad relacional depende de la capa de negocios, lo cual no es sano.

Podrías reforzarlo un poco añadiendo alguna restricción a nivel de base de datos. Por ejemplo, haciendo que en cada tabla el campo tipo_tran sea un ENUM y a ese ENUM le das una sola opción. Flaite la solución pero funcional.

En Oracle o en Postgres podrías usar derechamente constraints de tipo check.

Con esto puedes consultar

Código:
SELECT * FROM vw_transacciones WHERE ID_tran=40

Y eso ya viene con su respectiva tabla y tipo de transacción. Raya para la suma, esto funciona como funcionaría un particionamiento de tabla salvo que a la chilena porque tú le insertas a lo que serían las particiones y luego consultas a lo que sería la tabla. En un particionamento tú le insertas y le consultas a la tabla maestra y el RBDMS es el que por debajo se preocupa de rutear el registro a las particiones tanto para inserción como para consulta.

A nivel de eficiencia antes que una vista sería mejor una vista materializada, Si estás en un motor de base de datos distinto de MySQL eso es trivial. Sin embargo, en MySQL no existen las VMs y tendrías que emularlas (si es que lo necesitas por un tema de performance, digo) creando una tabla con la estructura de la vista más índices, y cada 60 o 120 segundos truncarla y rellenarla. Pero eso es poner más lógica que debiera ser responsabilidad de la BBDD fuera de la BBDD.

____________

Si tus ID son únicos a nivel de tabla (por ejemplo porque cada tabla tiene un ID autoincremental) no podrías consultar por ID_trans, tendrías que consultar por ID_trans + tipo_trans, pero si sabes el tipo trans ya sabes la tabla, y el problema no existiría. Y si no sabes el tipo trans, entonces estás literalmente hasta el dick
 
Última modificación:
Upvote 0
Subir