none
Ayuda con el siguiente modelo de datos RRS feed

  • Pregunta

  • Tengo las siguientes tablas
    create table dbo.TipoA (
    int Id identity(1,1),
    Tipo varchar(50) not null
    )
    go
    create table dbo.TipoB (
    int Id identity(1,1),
    Tipo varchar(50) not null
    )
    go
    create table dbo.TipoC (
    int Id identity(1,1),
    Tipo varchar(50) not null
    )
    go
    create table dbo.TipoD (
    int Id identity(1,1),
    Tipo varchar(50) not null
    )
    go


    create table dbo.Principal(
    int Id identity(1,1),
    Valor varchar(50) not null
    )
    create table dbo.PrincipalTipoA(
    int PrincipalId foreign key references dbo.Principal(Id),
    Valor varchar(50) not null
    )
    create table dbo.PrincipalTipoB(
    int PrincipalId foreign key references dbo.Principal(Id),
    Valor varchar(50) not null
    )
    create table dbo.PrincipalTipoC(
    int PrincipalId foreign key references dbo.Principal(Id),
    Valor varchar(50) not null
    )
    create table dbo.PrincipalTipoD(
    int PrincipalId foreign key references dbo.Principal(Id),
    Valor varchar(50) not null
    )

    Tengo 4 tablas llamadas Tipo y una tabla Principal "de informacion" cada registro de esta tabla posee una ferencia a alguna de estas tablas Tipo

    "No puede poseer varias referencias a distintas Tablas Tipo"

    Necesito hacer una consulta que me retorne los campo de la tabla dbo.Principal con su respectivo campo Tipo, el problema esta en que tendria que referencia a las 3 tablas ya que no se cual es...
    Tengo Sql Server 2008
    Me podrian ayuda a realizar esta consulta y si se puede mejorar mi modelo de datos 
    miércoles, 22 de febrero de 2012 5:08

Respuestas

Todas las respuestas

  • Hola.

    Por favor, intenta explicarlo de otro modo. Nos pasas 8 tablas (y no 4) y la relación entre las tablas no es fácil deducirla de lo que nos cuentas. No explicas cómo se relacionan ni por qué. Y el mensaje entrecomillado es de lo más confuso también. Si pusieras datos de ejemplo sería más fácil interpretarlo.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/ Sígueme en twitter en http://twitter.com/qwalgrande

    miércoles, 22 de febrero de 2012 8:06
    Moderador
  • Hola.

    Por favor, intenta explicarlo de otro modo. Nos pasas 8 tablas (y no 4) y la relación entre las tablas no es fácil deducirla de lo que nos cuentas. No explicas cómo se relacionan ni por qué. Y el mensaje entrecomillado es de lo más confuso también. Si pusieras datos de ejemplo sería más fácil interpretarlo.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/ Sígueme en twitter en http://twitter.com/qwalgrande

    Hola, me disculpo por lo poco claro, aunque pondre todo mas exacto. Ya hay una base de datos "ya funcional"... La cual digamos que opera o gestiona distintos módulos, en total son 4 Modulos para el ejemplo solo hablare de 2 "Productos y Servicios"
    Cada uno de estos módulos poseen su propia tabla de Categorias.


    create table dbo.CategoriasProductos(
    Id int identity(1,1),
    Categoria varchar(50) not null,
    PadreId int not null foreign key references dbo.CategoriasProductos(Id)
    )
    go
    create table dbo.CategoriasServicios(
    Id int identity(1,1),
    Categoria varchar(50) not null,
    PadreId int not null foreign key references dbo.CategoriasServicios(Id)
    )

    Agregare 3 registros a cada tabla

    insert into dbo.CategoriasProductos(Categoria) values ('Celulares'), ('Libros'), ('Eléctrodomesticos')
    insert into dbo.CategoriasServicios(Categoria) values ('Administradores'), ('Programadores'), ('Diseñadores')

    Ya la base de datos esta en uso y los Modulos no poseen ninguna relación entre si, no hay tablas ni nada, ahora se quiere hacer una tabla la cual llamare Registros y va algo asi...

    create table dbo.Registros(
    Id int identity(1,1),
    Valor varchar(50) not null,
    Fecha datetime not null
    )

    Se quiere, que esa tabla posea una relación a cualquiera de las tablas Categorias, es decir, alli habran N registros y estos registros deben poseer una relación a alguna de las tablas Categorias de cualquier modulo.

    Solo se me ocurrio algo asi...

    create table dbo.RegistrosCategoriasProductos(
    RegistroId int foreign key references dbo.Registros(Id),
    CategoriaId int foreign key references dbo.CategoriasProductos(Id)
    )
    create table dbo.RegistrosCategoriasServicios(
    RegistroId int foreign key references dbo.Registros(Id),
    CategoriaId int foreign key references dbo.CategoriasServicios(Id)
    )

    Ahora tengo el siguiente store procedure que aunque no me gusto mucho asi fue que pude hacerlo

    create procedure dbo.GuardarRegistro
    @Id int,
    @Valor varchar(50),
    @CategoriaId int,
    @Modulo int
    as
    begin
    if @Id is null -- Si no hay Id asociaco guardo de lo contrario actualizo
    begin
    insert into dbo.Registros (Valor, Fecha) values (@Valor, GETDATE())
    set @id = SCOPE_IDENTITY()

    if @Modulo = 1
    insert into dbo.RegistrosCategoriasProductos (RegistroId, CategoriaId) values (@id, @CategoriaId)
    else if @Modulo = 2
    insert into dbo.RegistrosCategoriasServicios (RegistroId, CategoriaId) values (@id, @CategoriaId)
    end
    end

    Ahora ingreso unos registros

    exec dbo.GuardarRegistro null, 'Producto 1', 1, 1
    exec dbo.GuardarRegistro null, 'Servicio 1', 1, 2

    Ahora bien, tengo que hacer una consulta que me retorne lo siguiente...

    Id Valor Categoria
    1 Producto 1 'Celulares'
    1 Servicio 1 'Administradores'

    Como se puede ver Celulares y Administradores pertenecen a Categorias distintas... Pero desde la tabla Registros no hay algo que me especifique directamente cual es la tabla "Categorias" que posee su registro hijo, puede ser la de Articulos, Servicios, etc... Asi que supongo que tengo que hacer un query que me navegue por todas las tablas de Categorias.

    Quiero que me ayuden a realizar este query o si se puede a mejorar mi modelo de datos si conocen alguna mejor forma, porque la verdad no ayuda mucho.

    Gracias de nuevo
    miércoles, 22 de febrero de 2012 15:06
  • Hola.

    Debes realizar una sentencia de unión que te permita juntar el cruce por productos y por servicios. Sería más o menos así:

    select Id, Valor, Categoria
    from CategoriasProductos
    union all
    select Id, Valor, Categoria
    from CategoriasServicios

    Yo añadiría también un campo, aunque no se persista, que indique en el resultado si se trata de un producto o un servicio. 

    Espero haberte dado una pista, si no es así, nos dices.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/ Sígueme en twitter en http://twitter.com/qwalgrande

    jueves, 5 de abril de 2012 18:53
    Moderador