none
Normalización de Base de Datos RRS feed

  • Pregunta

  • Hola comunidad.

    Tengo una incognita con respecto al diseño de una base de datos en el sentido de la normalización, el escenario que se presenta es el siguiente:

    • Se tienen 3 tablas: Articulo, Factura y FacturaDetalle
    • Articulo: (PK)IDArticulo, Parte, Descripcion 
    • Factura: (PK)IDFactura, Folio, Fecha
    • DetalleFactura: (PK)IDDetalle, (FK)IDFactura, (FK)IDArticulo, Cantidad

    El asunto radica en que en el detalle de la factura, se necesita el campo Descripcion "repetido" ya que el usuario puede cambiar la descripcion del articulo independiente a la descripcion de la tabla Articulo, entonces esto nos da a que un articulo puede tener 1 o varias descripciones, por lo tanto al normalizar nos quedaría:

    • Articulo:(PK)IDArticulo, Parte
    • ArticuloDescripcion: (FK)IDArticulo, Descripcion

    Con esto normalizamos la tabla de Articulo (a menos que alguien me de su opinion y diga que hay algo erróneo).

    Ahora bien, la duda está en cómo queda la tabla DetalleFactura, por que la idea es que la tabla de factura solo muestre una sola descripción, es decir, de alguna forma tendra que tener una relación con ArticuloDescripcion para que de esta forma sea una descripcion en especifico la que muestre...

    O de plano hay que seguir otro camino, espero puedan apoyarme con sus comentarios, si hay algo que no sea explicito haganmelo saber, o bien cual seria la solución a este escenario, contemplando que la base de datos debera estar en Tercer Forma Normal

    gracias.

    jueves, 19 de enero de 2017 1:30

Respuestas

  • gaunmanuel,

    Debes tener claro el objetivo de la normalización:

    1. Evitar repetir datos (redundancia). Sí sólo escribes una descripción alterna cuando sea requerido (Esferas de acero, Balón de acero, Esfera, etc.) no estas repitiendo el mismo valor que defines en la columna descripción, escribes un valor "custom" que entiendo sólo es para fines de impresión. Entonces, para evitar la duplicidad debes escribir en la columna [Glosa] (o como decidas llamarla) únicamente cuando se desee "personalizar" la descripción del producto.
    2. Resguardar la coherencia de los datos. Una descripción alterna es un valor distinto a la descripción original del producto.

    Como punto adicional, considera que la columna que contiene la descripción alternativa no es un atributo de la entidad 'Producto', es un atributo de la entidad 'Venta' porque sirve para los propósitos propios de la venta, por ejemplo para la impresión.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 20 de enero de 2017 18:45
  • Pregunta:

    De cual otras columnas depende esta ultima descripcion?

    Segun entendi, en tu caso seria (IDFactura, IDArticulo)  y por lo tanto no rompe la 3ra FN. Depende de toda la PK (2NF), no depende de otro atributo que no es clave (3NF).



    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas


    viernes, 20 de enero de 2017 18:57
  • Hola, buenas tardes

    Si ese campo "Descripción" lo llamamos "NombreArticuloUsuario" que va a recibir el nombre que el usuario le ponga al artículo, y si el usuario no le coloca nombre se le pone por defecto el nombre del artículo, no estarías haciendo duplicidad de información, simplemente estás colocando el nombre del artículo para no llenar con "Null" el campo de la tabla.

    Saludos.

    lunes, 23 de enero de 2017 20:01

Todas las respuestas

  • gaunmanuel,

    ¿Las descripciones alternas las tienes tipificadas?, si es así entonces es correcto crear la tabla [ArticuloDescripcion] conteniendo las posibles descripciones (técnica, comercial, etc.), y la tabla [DetalleFactura] debe registrar la referencia a las tablas [Articulo] y [ArticuloDescripcion].

    Si no es posible tipificar las descripciones entonces olvida la tabla [ArticuloDescripcion] y agrega en la tabla [DetalleFactura] la columna [Glosa] (o como prefieras nombrarla) que contendrá la descripción que el usuario escriba únicamente cuando sea distinto a la descripción "original" (por lo general con fines de impresión), queda claro que si la descripción es la misma la columna [Glosa] contendrá NULL.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    jueves, 19 de enero de 2017 5:52
  • que tal Williams. de ante mano gracias por tu aporte.

    Realmente no está tipificada, es decir, no hay diferentes tipos de descripciones, simplemente son diferentes descripciones, por ejemplo la descripcion original de la table ARTICULO digamos que es "Bolas de Acero", sin embargo por alguna razón se require por ocasiones no usar "Bolas de Acero" y se cambia por "Esferas de Acero".

    Como actualmente lo manejo es como tú mencionas, tengo un campo Descripción en la tabla DetalleFactura, este campo se llena automaticamente con la descripción original de la tabla ARTICULO y posterior el usuario puede modificarla, así que realmente nunca esta vacía.

    Mi cuestion es, si el tener este campo Descripción "duplicado" ya no cumpliria con las 3 formas de normalización? o bien la forma en que me mencionas de la columna "GLOSA" lo cual actualmente la estoy manejando así, no afecta a las reglas de normalización?

    saludos.

    viernes, 20 de enero de 2017 18:18
  • gaunmanuel,

    Debes tener claro el objetivo de la normalización:

    1. Evitar repetir datos (redundancia). Sí sólo escribes una descripción alterna cuando sea requerido (Esferas de acero, Balón de acero, Esfera, etc.) no estas repitiendo el mismo valor que defines en la columna descripción, escribes un valor "custom" que entiendo sólo es para fines de impresión. Entonces, para evitar la duplicidad debes escribir en la columna [Glosa] (o como decidas llamarla) únicamente cuando se desee "personalizar" la descripción del producto.
    2. Resguardar la coherencia de los datos. Una descripción alterna es un valor distinto a la descripción original del producto.

    Como punto adicional, considera que la columna que contiene la descripción alternativa no es un atributo de la entidad 'Producto', es un atributo de la entidad 'Venta' porque sirve para los propósitos propios de la venta, por ejemplo para la impresión.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 20 de enero de 2017 18:45
  • Pregunta:

    De cual otras columnas depende esta ultima descripcion?

    Segun entendi, en tu caso seria (IDFactura, IDArticulo)  y por lo tanto no rompe la 3ra FN. Depende de toda la PK (2NF), no depende de otro atributo que no es clave (3NF).



    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas


    viernes, 20 de enero de 2017 18:57
  • Que tal.

    La descripcion realmente depente de IDArticulo, es decir realmente estoy haciendo duplicidad de información...

    La descripción pertenece a la tabla articulo y en la tabla de DetalleFactura, la vuelvo a repetir, por el hecho de que dicha descripción puede cambiar a pesar de que depende del IDArticulo.

    fue por eso mi cuestionamiento, como se trata un caso asi, para seguir en 3NF?

    según todo parece indicar, simplemente la columna descripción en DetalleFactura es otro campo más, sin dependencia de nadie, aunque en primera instancia este campo se debe llenar por omisión con la descripción de la tabla Articulo según el IDArticulo relacionado.

    saludos.

    lunes, 23 de enero de 2017 19:17
  • Hola, buenas tardes

    Si ese campo "Descripción" lo llamamos "NombreArticuloUsuario" que va a recibir el nombre que el usuario le ponga al artículo, y si el usuario no le coloca nombre se le pone por defecto el nombre del artículo, no estarías haciendo duplicidad de información, simplemente estás colocando el nombre del artículo para no llenar con "Null" el campo de la tabla.

    Saludos.

    lunes, 23 de enero de 2017 20:01
  • gaunmanuel,

    Entiendo tu preocupación por diseñar el modelo de manera correcta sin embargo creo que estas confundiendo la relación de pertenencia entre un atributo y la entidad. La columna donde el usuario almacena una glosa (descripción alterna) no es un atributo del producto, es un atributo de la venta, de hecho ya te lo había comentado.

    Es bastante común ver formularios de venta donde el usuario selecciona un producto y se muestra la descripción del mismo según la tabla base, el formulario proporciona la posibilidad de que el usuario escriba (en un cuadro de texto distinto) una glosa o descripción alterna según considere oportuno, si no escribe una descripción alterna el valor de la columna es NULL. Quizá la confusión viene en el sentido de que tú almacenas un valor incluso cuando el usuario no escribe una descripción alterna, no es necesario, ¿no crees?, es una columna opcional, finalmente el nombre del producto es el que está registrado en la tabla base. ¿Quieres obtener la descripción de un producto de la venta? pues si hay una descripción alterna tomas dicho valor caso contrario navegas a la tabla [Productos] para obtener la descripción "original".


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    lunes, 23 de enero de 2017 20:20
  • Que tal Wiillams, creo que ya quedo entendido.

    muchas gracias a todos, por su aportación.

    saludos.

    martes, 24 de enero de 2017 1:52