Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

[SOLUCIONADO] Duda sobre normalización (otra)

Estas en el tema de Duda sobre normalización (otra) en el foro de Bases de Datos General en Foros del Web. Cita: - Los libros no enseñan todo, la práctica en este rubro es muy importante, y la guia de gente que conoce el tema, lo ...

  #31 (permalink)  
Antiguo 30/08/2013, 12:37
Avatar de korg1988  
Fecha de Ingreso: junio-2006
Ubicación: Santa Fe, Argentina
Mensajes: 825
Antigüedad: 17 años, 10 meses
Puntos: 19
Respuesta: Duda sobre normalización (otra)

Cita:
- Los libros no enseñan todo, la práctica en este rubro es muy importante, y la guia de gente que conoce el tema, lo es más.
Hace varios años que vengo trabajando de esto, y hoy es un momento en que quiero dar un salto, y hacer mejor que ayer las cosas! por eso me obsesione con este tema y hace unos dias que vengo dandole!

Cita:
- Estamos tratando de guiarte para que adquieras en un día, conocimientos prácticos y teóricos que llevan un año entero, ocho exámenes y dos finales en cualquier facultad que se precie. ¿Te parece que eso es fácil de dominar?
No dudo eso, ni por asomo, pero casualmente tengo que presentar un trabajo y necesito terminar urgente con esto!... Por eso quiero hacerlo de la mejor manera posible, al momento, y luego tranquilo dedicarme a profundizar (es lo que he hecho siempre), desde el momento en que inicie y no sabia diferenciar entre codigo php y codigo python hasta hoy en dia... es el mismo progreso del que hablas.

Mi base de datos no esta desastrosa porque yo sea un desastre, sino porque vengo probando cosas hace dias, y pensando todo lo que vengo leyendo y venimos hablando y no es ningún modelo definitivo el que tengo armado, es mas, esta lleno de basura!:.
Pero necesito entender estos puntos para poder hacer las cosas de una manera mas optima esta vez, no quiero ya conformarme con solamente "hacer que funcione".

Gracias por tu ayuda! De verdad!

Mi duda ahora es la siguiente, considerando estas tablas

Personas
---
id
domicilio
telefono


PersonasFisicas
---
nombre
apellido

PersonasJuridicas
---
razon_social


de que forma establezco la relacion con la tabla cuentas por ejemplo?
Considerando de que cada cuenta pertenece a una persona!:..
Lo hago directamente con la tabla Personas?
Y a la hora de consultar todos los datos de esa persona en particular, como se en que caso debo traerlos de la tabla PersonasFisicas, y en que caso traerlos de la tabla PersonasJuridicas?
  #32 (permalink)  
Antiguo 30/08/2013, 12:48
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 6 meses
Puntos: 2658
Respuesta: Duda sobre normalización (otra)

Cita:
Considerando de que cada cuenta pertenece a una persona!:..
Lo hago directamente con la tabla Personas?
Toda vinculación de cualquier relación con un cliente (Persona en este caso) es siempre con la tabla padre. Nunca con la tabla de segundo nivel, donde sólo se relacionan aquellas entidades que la afectan como persona (física o jurídica). Y las cuentas no son el caso.
Las cuentas son del cliente, mas allá de si es físico o jurídico (sigue siendo cliente).
Cita:
Y a la hora de consultar todos los datos de esa persona en particular, como se en que caso debo traerlos de la tabla PersonasFisicas, y en que caso traerlos de la tabla PersonasJuridicas?
En ese punto se aprovechan las capacidades de los stored procedures. Esa lógica se deja dentro del mismo, ya que se puede construir uno que devuelva un cursor o una tabla, y según sea la tipificación del cliente, es el caso desde donde se lo llama en el DAC.
No hemos hablado de qué DBMS usarás, pero algunos de ellos permiten sobrecarga de SP, al igual que los lenguajes OO, tal que con el mismo nombre y diferencia de parámtros, puedes invocar la petición correspondiente.
Además, el uso de SP para esa etapa facilita el aislamiento de la lógica del SQL respecto de la aplicación, desacoplando ambas cosas y dando mucha capacidad de evolucionar.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #33 (permalink)  
Antiguo 31/08/2013, 07:36
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 6 meses
Puntos: 2658
Respuesta: Duda sobre normalización (otra)

Continuando con las ideas, y ya fuera de horario de trabajo, trataré de exponerte un par de conceptos respecto a los movimientos de cuentas, en cuanto a ventas, facturación y pagos que puedan orientarte al respecto, como para que tu solución no termine dispersando información que no deba estar en diferentes tablas.
Supongamos que tienes ya Clientes. La diferenciación de si son Personas físicas o Jurídicas no hace realmente al fondo de la operación comercial, porque lo que realmente tiene impacto es la carga impositiva que debe agregarse a los importes facturados.
Siendo que estás, en Santa Fe, en el mismo país, lo mencionaré como IVA e IGB. Supongo que con eso alcanza.
Todo cliente, tiene una posición ante el IVA y eso determinará lo que se le impute de impuestos al respecto. En cuanto al IGB, eso tiene dos determinantes: 1) el domicilio de facturación y 2) la inscripción en el Mulitilateral.
Si en IGB estás sólo en una provincia, o tienes el IGB local o tienes el multilateral; pero si estás en más de más de una, las alícuotas de los IGB cambian en cada provincia, lo mismo que algunos impuestos.
esto hace que necesites al menos tres tablas para determinar los impuestos aplicables: 1) La nomina de impuestos y 2) La tabla de Entidades impositivas (incluyendo los impuestos y tasas de la ciudad, 3) las condiciones impositivas, en función del impuesto y el organismo recaudador.
Obviamente, deberás tener una o más tablas fijas para ciudades y Provincias, pero eso ya lo debes haber tenido en cuenta.
Esto sólo para poder averiguar qué impuestos se le aplicaran al momento de facturar, y aún no facturamos.
Luego, a nivel de facturación debes tener en cuenta que la facturación no implica cobranza, en especial cuando un Cliente puede tener Cuentas de diverso tipo.
Entonces, cuando vemos al cliente desde su acción comercial, un cliente es una entidad que genera movimientos únicamente por Venta, no por Compra. Es decir, si la misma persona es cliente y proveedor, son entidades distintas. No se tiene en cuenta ambas cosas para la misma lógica, porque entre otras cosas, pertenecen a subistemas independientes.
El cliente realiza una compra (Venta del sistema), la que genera: 1) Una Factura, 2) Un detalle de factura, 3) Un movimiento de cuenta del cliente donde se vincula la factura (no el detalle), 4) Un documento de Pago, el cual a su vez puede tener diferentes estados (Pagado, Pendiente, Informado, Cancelado, por ejemplo). Según el estado del documento de pago, será la imputación luego a Banco, Caja, Tarjetas, etc. Pueden existir incluso movimientos compensatorios, pero eso es otro cantar y más complicado.
Como sea, hasta allí tenemos:
- Factura
- DetalleFactura
- DocumentoPago
- DetallePagoDocumentos (opcional, si un mismo pago abarca más de una factura)
- EstadosDocumento
- MovimientosCuenta
- CuentaCliente
- MediosPago
- Caja
- PagoEntidades (aprobaciones de tarjetas de credito, debito, otros medios)
- Entidades (las dueñas o proveedoras de las tarjetas, incluyendo bancos)
- PeriodosFacturacion (para las cuentas corrientes)

- ... y no se si me olvido de alguna ( )

En este momento tu posiblemente preguntes: ¿métodos de pago de cliente?
Esas son VIEWs, no tablas. Es decir, son vistas de BBDD para ciertos usos, pero por definición, un mismo cliente puede usar tantos medios de pago como acepte la empresa y / o tenga el cliente para pagar. Predefinir eso, no existe. Como mucho se debería registrar si la cuenta (CuentaCliente) es de pago por débito automático (se obtiene de MediosPago), y de se así se usan columnas flag para saber qué tipo de medio de pago se usará para ese cobro.
Hay muchas partes de esto que se resuelven luego en la lógica diseñada de los stored procedure.
Vale decir, la información que se usa para reportes no necesariamente representa tablas independientes (generalmente NO SON TABLAS), sino que se generan dinámicamente en las consultas.
¿Por qué?
Por dos razones básicas: 1) No tiene sentido almacenar información cambiante en el tiempo, y 2) Al generarse en modo dinámico, los datos siempre están actualizados y se puede evitar representar información que ya no resulta útil (caso, las facturas correspondientes a periodos contables que no se reportarán más).

En la empresa en que trabajo existen varios packages (usamos Oracle), con centenares de SP y SF que realizan estas validaciones, de modo que el sistema simplemente le envía a la base lo que debe cobrarse y son esos SP los que generan todas las validaciones e inserciones correspondeintes.
Y el pero de todos los SP es el de facturación (analizarlo completo llevaría semanas), ya que debe revalidar todo para obtener lo que necesita, simplemente para emitir un ticket.

Por allí tu preguntes ¿no es demasiado complicado?

...Bueno, te estoy dando una descripción simple. MUY simple. Los verdaderos sistemas de ventas son muchísimo más complejos.
Acá apenas te estoy describiendo un caso sacado de los apuntes y prácticas de clase, al momento en que cursara la asignatura.

En definitiva: Más allá de que esto te sea útil, debes tratar de simplificar las estructuras de las entidades, de modo que la base tenga la menor cantidad de tablas posible. Poner de más, sólo te traerá complicaciones (lamentablemente eso se aprende con la práctica, los libros no ayudan mucho).
Algunos de consejos muy básicos:
1) Si en la misma tabla ciertos campos aparecen como nulos en varios registros, es señal de que se debe normalizar, y separar esos datos en una tabla dependiente. Pero esa tabla no debe tener clave propia, sino que hereda la de su tabla madre.
2) Concentra las entidades que representen LO MISMO a nivel lógico. Que dos entidades tengan iguales datos no implica que sean lo mismo. Son iguales sí y sólo si se trata del mismo objeto (autos y motos son vehículos, y tienen datos comunes, pero no son iguales).
3) No geners una misma estructura de base para todos los subsistemas. Proveedores y Clientes no deben estar en la misma estructura de base (esquema), aunque compartan ciertas tablas, o pertenezcan al mismo esquema global. Esto al menos por dos motivos: 1) No tienen el mismo sistema administrativo, ni requisitos, 2) No están afectados por las mismas documentaciones comerciales (sus facturas no son las nuestras, y por tanto deben registrarse en base a otros atributos).
De hecho, y como dato final, el esquema de Cobranzas, no debería pertenecer al mismo esquema que Ventas, ya que también suele tener un circuito administrativo distinto. Si observas la organización de cualquier empresa chica (PyME), verás que las áreas de Ventas, Proveedores y Cobranzas, son funciones con circuitos y personas con funciones separadas....

Bueno. Espero que este pantallazo te sirva de algo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #34 (permalink)  
Antiguo 23/09/2013, 08:04
Avatar de korg1988  
Fecha de Ingreso: junio-2006
Ubicación: Santa Fe, Argentina
Mensajes: 825
Antigüedad: 17 años, 10 meses
Puntos: 19
Respuesta: Duda sobre normalización (otra)

Buscando mucho en google y leyendo todo lo que me han explicado, he llegado a comprender como normalizar utilizando herencia de tablas, y ver en que casos me conviene usarlo, para prevenir muchos campos nulls en las tablas, y no sobre normalizar tampoco!
Te agradezco por tu tiempo porque ha dado frutos créeme!

Etiquetas: tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:20.