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 / 19039
Accepted
xenoterracide
xenoterracide
Asked: 2012-06-11 10:57:13 +0800 CST2012-06-11 10:57:13 +0800 CST 2012-06-11 10:57:13 +0800 CST

id e número de telefone são suficientes para identificar exclusivamente uma linha em números de telefone

  • 772

Estava projetando uma tabela uma customer_phone_numberstabela um tempo atrás, cujo único propósito era nos permitir armazenar quantos números de telefone um usuário quisesse ter em arquivo. Originalmente, cheguei à conclusão de que customer_id+ phone_numberera único, mas então me ocorreu que é possível que o mesmo usuário tenha 2 ramais no mesmo número. Não tenho certeza da probabilidade disso, e isso cria outro problema.

phone_number ext
555-555-555, NULL
555-555-555, NULL

torna-se legal, a menos que eu encontre uma boa maneira de restringir ext contra null. Qual é a melhor maneira de normalizar e restringir números de telefone?

database-design normalization
  • 3 3 respostas
  • 729 Views

3 respostas

  • Voted
  1. Best Answer
    Aaron Bertrand
    2012-06-11T15:20:38+08:002012-06-11T15:20:38+08:00

    Provavelmente existem maneiras de resolver isso (por exemplo, um gatilho em vez de uma restrição explícita ou um índice filtrado inteligente se em 2008+), mas por quê?

    Por exemplo, você pode fazer isso com dois índices filtrados em 2008+:

    CREATE TABLE #cpn(c INT, pn VARCHAR(32), x VARCHAR(8000));
    
    CREATE UNIQUE INDEX x ON #cpn(c, pn) WHERE x IS NULL;
    CREATE UNIQUE INDEX y ON #cpn(c, pn, x) WHERE x IS NOT NULL;
    
    INSERT #cpn(c, pn   ) SELECT 1, '555-5555';        -- OK
    INSERT #cpn(c, pn, x) SELECT 1, '555-5555', '345'; -- OK
    INSERT #cpn(c, pn, x) SELECT 1, '555-5555', '555'; -- OK
    GO
    INSERT #cpn(c, pn   ) SELECT 1, '555-5555';        -- fails on index x
    GO
    INSERT #cpn(c, pn, x) SELECT 1, '555-5555', '345'; -- fails on index y
    

    Mas eu não consigo ver o ponto. Isso parece uma flexibilidade desnecessária. Se vou ligar para o escritório e tentar falar com Bob no ramal 55, por que seria mais provável que eu o encontrasse no ramal 67? Isso parece um cenário viável do mundo real para alguém?

    Sugiro que você torne uma regra de negócios que um usuário possa ter apenas um ramal no mesmo número. Dessa forma, você pode manter sua restrição no ID do cliente e no número de telefone e permitir que a extensão seja opcional.

    Além disso, supondo que você esteja armazenando números de telefone e extensões como strings, você pode seguir o caminho inverso e permitir que as pessoas os insiram juntos em vez de separados. Se eles querem inserir 15 ramais diferentes no mesmo número, por que impedi-los? Também acho bobo permitir uma extensão de 0, mas isso também permitiria.

    • 3
  2. Jon of All Trades
    2012-06-12T07:25:34+08:002012-06-12T07:25:34+08:00

    Apenas jogando por aí: você poderia colocar seu PK em { CustomerID, PhoneType }. Você estaria armazenando um pouco de contexto sobre o significado de cada número de telefone, o que pode ser útil.

    Se você tornar PhoneType uma string de texto livre em vez de um FK para uma tabela de dimensão PhoneTypes, permitirá um número indefinido de números de telefone por cliente (ou poderá torná-lo um FK, mas permitir que os usuários criem novos tipos de telefone, embora eu não não vá longe). No entanto, incentive os usuários a escolher em uma lista de tipos de telefone comuns (trabalho, casa, celular, fax).

    • 2
  3. AmmarR
    2012-06-11T13:02:48+08:002012-06-11T13:02:48+08:00

    Você não pode criar uma restrição UNIQUE e permitir NULL em sql server , então acho que você pode armazenar o valor padrão 0 no ext e, ao exibi-lo, use case para exibir ext como valor vazio

    Select 
    customer_id, 
    phone_number, 
    ext = case when ext = 0 then '' else ext  
    end
    
    • 0

relate perguntas

  • É melhor armazenar os valores calculados ou recalculá-los a pedido? [duplicado]

  • Armazenar vs calcular valores agregados

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

  • As formas normalizadas superiores sempre atendem aos critérios das inferiores?

  • Recursos de exercícios de normalização

Sidebar

Stats

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

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 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

    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

    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
    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
    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
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +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