none
Mejor forma de diseñar DB RRS feed

  • Pregunta

  • Hola quisiera preguntarles como me recomiendan diseñar una tabla que tenga estas caracteristicas.

    Primero tengo una ya diseñada que tiene estos campos:

    Nombre tabla: Producto

    Columnas: codigoProducto (string) nombreProducto(string) tipoProducto(string) proveedorProducto(string) precioBaseProducto(money).

    Y lo que necesito hacer, es crear una nueva tabla (Precio), que me devuelva para cada fecha que le agregue, el valor del precio base modificado por un %. Pero la duda que tengo es como diseñarla, si cada ves que agrego una fecha lo haga en forma de columna y me liste los codigos quedando algo asi: codigoProducto, precioBase, fechaPrecio1(en el headerText iria la fecha, y en la celda el precio modificado), FechaPrecio2..., fechaPrecioN, o hacer que las fechas se agregue por fila y cada ves que agrego un producto se agregue una columna a la tabla, quedando algo asi: fechaPrecio(que cada celda de esta columna de una fecha) y codigoProducto1(aca iria en el headerText el codigo del producto, y en cada celda de esta columna el precio modificado a det fecha), codigoProducto2... codigoProductoN.

    Bueno espero que hayan entendido. Desde ya gracias. 

    lunes, 2 de abril de 2018 7:38

Respuestas

  • Lo lógico es crear una tabla en la que almacenes registros del tipo  Producto - Fecha - Precio. Crear campos para cada fecha y precio sería una barbaridad.

    La tabla "Precio" tendría tres campos:

    codigoProducto
    - Fecha
    - Precio

    Cada fecha tendrá un registro en esa tabla. Tendrás que validar que no se repitan registros de la misma fecha para un mismo producto.


    Saludos, Javier J

    lunes, 2 de abril de 2018 7:48

Todas las respuestas

  • Lo lógico es crear una tabla en la que almacenes registros del tipo  Producto - Fecha - Precio. Crear campos para cada fecha y precio sería una barbaridad.

    La tabla "Precio" tendría tres campos:

    codigoProducto
    - Fecha
    - Precio

    Cada fecha tendrá un registro en esa tabla. Tendrás que validar que no se repitan registros de la misma fecha para un mismo producto.


    Saludos, Javier J

    lunes, 2 de abril de 2018 7:48
  • No entendí muy bien.  Lo mejor es presentar un gráfico que muestre el arreglo de filas y columnas que desea obtener.  Puede hacer esto fácilmente con MS Excel.

    Supongo que lo que desea es mantener una tabla de precios que indica qué precio tiene qué producto en una determinada fecha (aunque yo lo haría con un ámbito de fechas, no una fecha puntual).

    Como no entendí muy bien su explicación, me limitaré a enseñarle la forma que satisface las reglas de normalización de base de datos.

    Create Table dbo.tblPrecios
    (
        ID bigint Not Null Identity(1, 1) Primary Key Clustered
        , codigoProducto nvarchar(30) Not Null Foreign Key References Producto(codigoProducto)
        , FechaInicial datetime2 Not Null
        , FechaFinal datetime2 Null (Check (FechaFinal Is Null Or FechaFinal > FechaInicial)
        , Porcentaje float Not Null
    );
    
    --Ahora puede, por ejemplo, crear una "vista" que selecciona el precio para una determinada fecha
    Create Function dbo.fnPrecioDeProductos(@fecha datetime2)
    Returns Table
    As
        Return(Select
            p.*
            , pp.Porcentaje
            , p.precioBase * pp.Porcentaje As [Precio]
        From
            Producto As p
            Inner Join
            dbo.tblPrecios As pp
            On p.codigoProducto == pp.codigoProducto
        Where
            pp.FechaInicial <= @fecha
            And
            (
                pp.FechaFinal Is Null --Porcentaje sin fecha de expiración
                Or
                pp.FechaFinal > @fecha
            )
        );
    Go
    

    La función dbo.fnPrecioDeProductos() devuelve una tabla y puede unirse a otras tablas con JOIN y por lo tanto puede crear consultas que la utilicen y puede inclusive agregar una cláusula WHERE que filtre para un único código de producto, por ejemplo.


    Jose R. MCP
    Code Samples

    lunes, 2 de abril de 2018 8:00
  • Para diseñar una base de datos debes atender las reglas de normalización, lo que pretendes realizar es una forma de presentar los datos, pero es una pésima idea si así es como quieres almacenarlos. Diseña la tabla según te recomienda José, luego, trasponer las filas a columnas es sencillo, ya sea que lo hagas desde la base de datos o desde la aplicación, pero que quede claro que es una tarea de formato, de presentación, no es un requerimiento de persistencia.
    martes, 3 de abril de 2018 2:59