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 / 243783
Accepted
Joe
Joe
Asked: 2019-07-26 05:02:16 +0800 CST2019-07-26 05:02:16 +0800 CST 2019-07-26 05:02:16 +0800 CST

Como consultar "previsões" de endereço ao aplicar restrições

  • 772

Digamos que eu tenha esse esquema de banco de dados simplificado.Esquema de banco de dados

O esquema consiste em três tabelas, rua, cidade e CEP que têm uma relação muitos-para-muitos entre si.

O que eu quero fazer é uma previsão que consulte o banco de dados para possíveis correspondências, além de prever dados ausentes. Para colocar mais em um exemplo: digamos que o usuário comece a digitar uma cidade, talvez "Wash". Ele já tinha uma rua digitada, para eu não conhecer nenhuma rua, vamos chamar de "New Street Avenue". Esta é uma restrição , o que significa que deve ser cumprida em nossa previsão. Agora quero que a cidade consulte possíveis finalizadores de "Wash", bem como forneça dados ausentes, neste caso, CEPs, que tenham uma rua chamada "New Street Avenue"

Veja como seria a abordagem ingênua:

  1. Filtre a rua para todas as chaves cujo nome corresponda a "New Street Avenue"
  2. Filtre street_city para todas as chaves da rua e retorne as chaves da cidade
  3. Inner junte as chaves da cidade em city_zipcode e, em seguida, Inner junte-as no código postal

O problema com esta abordagem: O conhecimento entre rua e código postal é completamente ignorado. Isso significa que podemos acabar com CEPs e pares de cidades, onde sabemos que a cidade contém a rua que procuramos, mas o CEP não necessariamente . Esta seria uma previsão inválida para retornar, pois o endereço não existe!

Isso significa que preciso "persistir" as informações sobre a rua mais adiante.

Minha abordagem seria esta :

  1. Filtre a rua em busca das chaves que cumprem nossa condição.
  2. Inner Junte a rua na cidade para as chaves de #1. Mantenha ambas as colunas-chave.
  3. Inner join no city_zipcode mantendo as chaves do código postal também
  4. Filtre todos os pares de rua e CEP que não estão presentes em street_zipcode

(Em uma nota lateral: para "esperar" melhorar o desempenho, após cada "previsão", eu colocaria um comando LIMIT 10 (ou similar), pois precisamos apenas de uma quantidade sensata de previsões).

Essa abordagem deve funcionar. Pode não ser o melhor otimizado, mas retornaria os resultados corretos. No entanto, isso não apenas parece muito sujo para mim, mas também abre outro problema:

Tenho certeza de que escala horrivelmente, tanto no tamanho da mesa quanto nas tabelas adicionais

Há uma boa probabilidade de que haja outra tabela que tenha relacionamentos muitos para muitos, para fins de argumento, rua e CEP. Agora, se eu quiser pesquisar uma cidade com restrição de rua, preciso fazer o que fiz acima e adicionar ainda mais para filtrar também quaisquer relações entre rua e a nova tabela.

Sinto que estou entrando em um beco sem saída com essa abordagem. Eu adoraria alguém para me ajudar aqui sobre como abordar este problema melhor.

database-design performance
  • 1 1 respostas
  • 49 Views

1 respostas

  • Voted
  1. Best Answer
    Rick James
    2019-07-27T10:30:44+08:002019-07-27T10:30:44+08:00

    3 tabelas é o que eu chamo de "normalização excessiva" - isso leva a problemas de desempenho.

    "Normalizar" é usado para dois propósitos, nenhum dos quais realmente se aplica ao seu caso de uso.

    • Isole algo, diga "cidade" para que possa ser facilmente alterado. Na vida real, isso raramente acontece nas cidades. ("Bombaim" -> "Mumbai" (Índia), "Hot Springs" -> "Verdade ou Consequências" (Novo México))

    • Economize espaço. Mesmo se você tiver todas as 3 milhões de cidades na Terra, soletrar o país a cada vez não é um fardo de espaço. (Para países, recomendo os códigos de país padrão de 2 letras e use CHARACTER SET ascii. Opcionalmente, tenha uma tabela mapeando-os para nomes soletrados.)

    CEPs: Nos EUA, existem cerca de 42 mil CEPs. Para normalizar, você pode usar um arquivo SMALLINT UNSIGNED. Mas o código postal, em si, pode ser armazenado em um arquivo MEDIUMINT(5) UNSIGNED ZEROFILL. CEPs mudam. Mas isso geralmente envolve forçar metade dos usuários de um CEP a adotar um 'novo' CEP. Você teria que passar por todos os usuários desse CEP (que poderia ser INDEXed) para descobrir quais alterar.

    Da mesma forma para a separação da Iugoslávia e da Tchecoslováquia. Por outro lado, mudar "A República do Alto Volta" para "Burkina Faso" é fácil se você a 'normalizou'.

    Plano A (milhões de localizações): Basta soletrar a localização de cada item.

    Plano B (bilhões de locais): Dividido em dois: endereço e CEP+cidade+país

    Pense de outra forma: o que você fará com o endereço?

    • Apenas para envio de e-mail? Então por que dividir os pedaços; basta ter algum texto que possa ser prontamente impresso como está.
    • Também usado para estatísticas? Então você precisa, digamos, do "país" (ou "código_país") para poder fazer SELECT SUM... GROUP BY country_code. Isso implica que country_codeé uma coluna separada.
    • 0

relate perguntas

  • Como você ajusta o MySQL para uma carga de trabalho pesada do InnoDB?

  • Quais são algumas maneiras de implementar um relacionamento muitos-para-muitos em um data warehouse?

  • Como determinar se um Índice é necessário ou necessário

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

Sidebar

Stats

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

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

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

    • 4 respostas
  • Marko Smith

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

    • 10 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
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +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

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