none
1-Desempenho, qual é melhor? 2-Constraint validando atraves de outra coluna, é possivel? RRS feed

  • Pergunta

  • Ola
    tenho um seguinte problema
    tenho as seguintes tabelas (as escrevi de forma reduzida)
    table TBDebito (
    DbtID   INT
    )
    table TBCheque(
    ChqID
    )
    table TBSaque (
        SqeID
    )
    table TBDebitoCheque(
    DbtID
    ChqID
    )

    table TBDebitoSaque(
    DbtID
    SqeID
    )

    porem, eu nao posso permitir o pagamento de um debito ocorra de 2 formas (cheque, saque)
    eu verifico se ouve o pagamento numa das tabelas como forma de validacao, porem nao acho isso a forma mais correta, mais  nao encontrei outra forma, queria fazer isso por constraint, alguem pode me dar outra solucao?

    uma outra forma que pensei em fazer é
    table TBDebito (
    DbtID   INT
    )
    table TBCheque(
    ChqID
    )
    table TBSaque (
        SqeID
    )
    table TBDebitoPagamento(
    DbtID
    ChqID
    SqeID
    )

    sobre essa 2 opcao
    qual é a mais correta em relacao a desempenho, logica, escabilidade entre outras coisas
    tentei criar uma constraint dessa forma

    IF ChqID = 0
    BEGIN
        SqeID > 0
    END

    porem nao consegui
    existe como eu criar uma constraint tento como referencia outra coluna da tabela?

    alguem tem alguma ideia que possa ajudar, sera bem vinda
    T+
    Falow
    quarta-feira, 7 de março de 2007 23:57

Respostas

  •  

    uma maneira de criar uma constraint utilizando uma coluna de outra tabela seria fazer uma funcao que retorne 0 ou 1 assim vc. faz a comparacao na contraint, agora quando a performance sempre que usar operadores = eles sao melhores que o <> ou > < .

     

    Abs;

    sexta-feira, 9 de março de 2007 10:23
  • depende do volume se for grande o melhor seria deixar separada porque a vc. iria manipluar menos dados de uma vez so, mais quando digo grande seria tabelas com milhoes de registros, fora isso eu deixaria junto porque e mais pratico

     

    Abs;

     

     

    segunda-feira, 12 de março de 2007 10:18
  • Marcelo
    Veja como ficou a solução
    --CRIO A TABELA
    CREATE TABLE dbo.TBDbt(
        DbtID INT NULL,
        ChqID INT NULL,
        SqeID INT NULL,
        CONSTRAINT PK_TBDbt PRIMARY KEY
    )
    GO
    --CRIO A FUNCAO PARA VALIDAR
    CREATE FUNCTION FCDbtConstraint(
    @DbtID    INT)
    RETURNS TINYINT
    AS
    BEGIN
        DECLARE
        @ChqID        TINYINT,
        @Retorno    TINYINT

        SELECT @ChqID = ChqID FROM TBDbt
        WHERE DbtID = @DbtID AND SqeID = 0 AND ChqID <> 0

        IF EXISTS (SELECT ChqID FROM TBDbt    WHERE DbtID = @DbtID AND SqeID <> 0 AND ChqID <> 0)
        BEGIN
            SET @Retorno = 1
        END
        ELSE
        BEGIN
            SET @Retorno = 0
        END
        RETURN @Retorno
    END
    GO
    --ADICIONO A CONSTRAINT
    ALTER TABLE dbo.TBDbt  WITH CHECK
    ADD  CONSTRAINT CK_TBDbt_Chq_Sqe CHECK  ((dbo.FCDbtConstraint(DbtID)=(0)))
    GO
    --INSIRO DADOS PARA TESTAR
    INSERT INTO TBDbt VALUES (1,1,0)
    INSERT INTO TBDbt VALUES (2,0,1)
    INSERT INTO TBDbt VALUES (3,1,1)--Erro, nao permite
    INSERT INTO TBDbt VALUES (4,2,0)
    INSERT INTO TBDbt VALUES (5,0,4)
    INSERT INTO TBDbt VALUES (6,7,0)
    INSERT INTO TBDbt VALUES (7,0,9)
    INSERT INTO TBDbt VALUES (8,9,5)--Erro, nao permite
    INSERT INTO TBDbt VALUES (9,8,6)--Erro, nao permite

    e novamente
    Obrigado pela ajuda
    T+
    segunda-feira, 12 de março de 2007 19:53

Todas as Respostas

  •  

    uma maneira de criar uma constraint utilizando uma coluna de outra tabela seria fazer uma funcao que retorne 0 ou 1 assim vc. faz a comparacao na contraint, agora quando a performance sempre que usar operadores = eles sao melhores que o <> ou > < .

     

    Abs;

    sexta-feira, 9 de março de 2007 10:23
  • Ola marcelo
    mais quando disse a respeito de performance e manutencao foi em relaca a trocar as 2 tabelas separadas por apenas uma tabela, contendo o Debito,Cheque e Saque
    mais ou meno isso
    trocar essa logica
    table TBDebitoCheque(
    DbtID
    ChqID
    )

    table TBDebitoSaque(
    DbtID
    SqeID
    )
    Por essa

    TABLE TBDebitoEPagamento(
    DbtID
    ChqID
    SqeID
    )

    em resumo, unir as 2 tabelas

    nesse caso, qual seria melhor?
    falow
    e obrigado
    sábado, 10 de março de 2007 15:11
  • depende do volume se for grande o melhor seria deixar separada porque a vc. iria manipluar menos dados de uma vez so, mais quando digo grande seria tabelas com milhoes de registros, fora isso eu deixaria junto porque e mais pratico

     

    Abs;

     

     

    segunda-feira, 12 de março de 2007 10:18
  • bem nao é tao grande assim nao
    vou fazer os testes das constraints
    qualquer coisa retorno
    obrigado marcelo
    T+
    segunda-feira, 12 de março de 2007 15:23
  • Marcelo
    Veja como ficou a solução
    --CRIO A TABELA
    CREATE TABLE dbo.TBDbt(
        DbtID INT NULL,
        ChqID INT NULL,
        SqeID INT NULL,
        CONSTRAINT PK_TBDbt PRIMARY KEY
    )
    GO
    --CRIO A FUNCAO PARA VALIDAR
    CREATE FUNCTION FCDbtConstraint(
    @DbtID    INT)
    RETURNS TINYINT
    AS
    BEGIN
        DECLARE
        @ChqID        TINYINT,
        @Retorno    TINYINT

        SELECT @ChqID = ChqID FROM TBDbt
        WHERE DbtID = @DbtID AND SqeID = 0 AND ChqID <> 0

        IF EXISTS (SELECT ChqID FROM TBDbt    WHERE DbtID = @DbtID AND SqeID <> 0 AND ChqID <> 0)
        BEGIN
            SET @Retorno = 1
        END
        ELSE
        BEGIN
            SET @Retorno = 0
        END
        RETURN @Retorno
    END
    GO
    --ADICIONO A CONSTRAINT
    ALTER TABLE dbo.TBDbt  WITH CHECK
    ADD  CONSTRAINT CK_TBDbt_Chq_Sqe CHECK  ((dbo.FCDbtConstraint(DbtID)=(0)))
    GO
    --INSIRO DADOS PARA TESTAR
    INSERT INTO TBDbt VALUES (1,1,0)
    INSERT INTO TBDbt VALUES (2,0,1)
    INSERT INTO TBDbt VALUES (3,1,1)--Erro, nao permite
    INSERT INTO TBDbt VALUES (4,2,0)
    INSERT INTO TBDbt VALUES (5,0,4)
    INSERT INTO TBDbt VALUES (6,7,0)
    INSERT INTO TBDbt VALUES (7,0,9)
    INSERT INTO TBDbt VALUES (8,9,5)--Erro, nao permite
    INSERT INTO TBDbt VALUES (9,8,6)--Erro, nao permite

    e novamente
    Obrigado pela ajuda
    T+
    segunda-feira, 12 de março de 2007 19:53