AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 2569
Accepted
kacalapy
kacalapy
Asked: 2011-05-07 10:27:58 +0800 CST2011-05-07 10:27:58 +0800 CST 2011-05-07 10:27:58 +0800 CST

Como consultar e agregar efetivamente um banco de dados SQL normalizado?

  • 772

Em relação à maneira mais eficiente de retornar vários agregados em um único procedimento armazenado?

Tenho um aplicativo do tipo e-mail e desejo selecionar todas as mensagens (caixa de entrada) para um usuário. O problema é que eu normalizo a parte do cabeçalho dos e-mails no banco de dados de forma que os dados simples entrem em uma tabela de mensagens e de, para, CC, BCC sejam armazenados em outra tabela.

Qual é a melhor maneira de selecionar mensagens (na íntegra - significando desnormalizar a mensagem completa) para que cada registro contenha todos os campos pertinentes à mensagem, incluindo todos os campos da tabela Message e quaisquer registros relacionados da tabela de destinatários relacionados à mensagem de acordo com o PK/ Relacionamento FK.

Uma coisa em que estou colocando muito peso é a eficiência da solução SQL porque este será o código que será executado muitas vezes e provavelmente será o sql mais executado de todo o banco de dados

Para contextualizar, aqui está uma visão do meu esquema de banco de dados.

ESQUEMA DE BD

sql-server-2005 query
  • 2 2 respostas
  • 3955 Views

2 respostas

  • Voted
  1. Best Answer
    RThomas
    2011-05-10T15:31:27+08:002011-05-10T15:31:27+08:00

    É assim que eu faria. Eu uso regularmente o Coalesce para colocar linhas em campos delimitados e ele sempre funciona e escala bem (contanto que você perceba que uma subconsulta SEMPRE causará algum impacto no desempenho).

    Se você não gostou de executá-lo como um procedimento armazenado, também pode reescrever facilmente como uma função com valor de tabela.

    Outra abordagem seria um CTE, suponho, mas não estou tão familiarizado com essa abordagem para digitar do zero.

    CREATE PROCEDURE GetMessageById
        @pMessageID int
    AS
    BEGIN
    
    SET NOCOUNT ON;
    
    Declare @pTo varchar(max)
    Declare @pCC varchar(max)
    Declare @pBC varchar(max)
    
    SELECT @pTo = COALESCE(@pTo + ', ', '') + [EmailAddress]
    FROM MessageRecipient
    WHERE MessageID = @pMessageID AND RecipientTypeID = 1 /** or whatever the id of TO field is */
    
    SELECT @pCC = COALESCE(@pCC + ', ', '') + [EmailAddress]
    FROM MessageRecipient
    WHERE MessageID = @pMessageID AND RecipientTypeID = 2 /** or whatever the id of CC field is */
    
    SELECT @pBC = COALESCE(@pBC + ', ', '') + [EmailAddress]
    FROM MessageRecipient
    WHERE MessageID = @pMessageID AND RecipientTypeID = 3 /** or whatever the id of BCC field is */
    
    SELECT Message.*, @pTo as [ToField], @pCC as [CCField], @pBC as [BCCField], (SELECT TOP 1 [EmailAddress] FROM MessageRecipient Where RecipientTypeID = 0 /**<sender id>*/ AND MessageID = @pmessageID) AS [FromField] FROM Message Where Message.ID = @pMessageID
    
    END
    GO
    

    Você pode se perguntar como o Coalesce funciona quando usado dessa maneira (eu fiz, quando o vi usado pela primeira vez). Basicamente ele cria uma consulta recursiva retornando cada valor não nulo subseqüente do conjunto, por sua vez, até o final do conjunto de retorno. Saindo do outro lado, você obtém uma lista delimitada por vírgulas de todos os resultados como uma única string.

    • 6
  2. Michael Riley - AKA Gunny
    2011-05-13T05:21:00+08:002011-05-13T05:21:00+08:00

    Eu criaria uma exibição chamada viewInbox que é desenvolvida por todas as tabelas de relacionamento um-para-um . Esta seria minha visão de consulta principal. Eu usaria essa exibição (viewInbox) para exibir uma lista de todos os itens da caixa de entrada.

    Quando o usuário detalhar a mensagem, eu traria de volta todas as informações, incluindo as relações um-para-muitos dos múltiplos To's, CC's e BCC's.

    • 5

relate perguntas

  • Restrições exclusivas em colunas anuláveis ​​no SQL Server 2005

  • Como alterar a ordem de disparo dos Triggers?

  • Alguém usou o modo sqlcmd na prática? [fechado]

  • Como altero o nome da instância no MS SQL 2005 sem instalar uma nova instância?

  • Downgrade do SQL Server 2008 para 2005

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve