O que é as melhores práticas em db design quando eu quero armazenar um valor que quer é selecionado a partir de uma lista suspensa ou usuário a entrar?

StackOverflow https://stackoverflow.com/questions/406550

Pergunta

Eu estou tentando encontrar a melhor maneira de projetar o banco de dados, a fim de permitir que o seguinte cenário:

  1. O usuário é apresentado com uma lista suspensa de Universidades (por exemplo)
  2. O usuário seleciona o seu / sua universidade a partir da lista se existir
  3. Se a universidade não existe, ele deve entrar em sua própria universidade em uma caixa de texto (tipo de como Outros: [___________])

como devo projetar o banco de dados para lidar com tal situação, dado que eu poderia querer classificar usando o ID universidade, por exemplo, (provavelmente apenas para o construído em universidades e não aqueles inseridos pelos usuários)

Obrigado!

Eu só quero torná-la semelhante à forma como Facebook lida com essa situação. Se o usuário seleciona a Educação (por realmente escrevendo na caixa de combinação que não é minha preocupação) e escolher um dos valores devolvidos, o que Facebook faz?

Em meu palpite, seria inserir o UserID ea EducationID em uma tabela de muitos-para-muitos. Agora, o que se o usuário está entrando não está no banco de dados em tudo? Ele ainda está armazenado em seu perfil, mas onde? digitação "St" ... sugerindo Stanford

universidade de digitação não-existente

Foi útil?

Solução

CREATE TABLE university
(
  id smallint NOT NULL,
  name text,
  public smallint,
  CONSTRAINT university_pk PRIMARY KEY (id)
);

CREATE TABLE person
(
  id smallint NOT NULL,
  university smallint,
  -- more columns here...
  CONSTRAINT person_pk PRIMARY KEY (id),
  CONSTRAINT person_university_fk FOREIGN KEY (university)
      REFERENCES university (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
);

pública é definido como 1 para a Unis no sistema, e 0 para introduzidos pelo utilizador-unis.

Outras dicas

Você poderia enganar: se você não está preocupado com a integridade referencial deste campo (ou seja, é só lá para mostrar-se no perfil de um usuário e não é necessário para regras de negócio rigorosamente aplicadas) , armazená-lo como uma coluna VARCHAR simples.

Para o seu suspensa, use uma consulta como:

SELECT DISTINCT(University) FROM Profiles

Se você quiser filtrar os erros de digitação ou one-offs, tente:

SELECT University FROM PROFILES
GROUP BY University
HAVING COUNT(University) > 10  -- where 10 is an arbitrary threshold you can tweak

Nós usamos este código em um de nossos bancos de dados para armazenar as designações comerciais de empresas contratadas; uma vez que este é apenas informativa (há um campo separado "Categoria" para impor regras de negócio) é uma solução aceitável.

Mantenha uma bandeira para as linhas entraram através de entrada do usuário na mesma mesa que você tem seus outros pontos de dados. Então você pode classificar usando a bandeira.

Uma maneira isso foi resolvido em uma empresa anterior I trabalharam em:

Crie duas colunas em sua tabela: 1) uma ID de nulo da cadeia fornecido pelo sistema (armazenado numa tabela separada) 2) o usuário seqüência fornecida

Apenas um deles está preenchido. A restrição pode impor isso (e, adicionalmente, que pelo menos uma dessas colunas é preenchida se for o caso).

Note-se que o problema que estávamos resolvendo com isso foi um verdadeiro "Outros:" a situação. Era uma descrição textual de um item com alguns padrões predefinidos. Seus sons situação como uma entidade real que não está na lista, S. T. mais de um usuário pode querer entrada da mesma universidade.

Este não é um problema de design de banco de dados. É uma questão de interface do usuário.

The Drop lista de universidades para baixo é baseada em linhas em uma tabela. Essa tabela deve ter uma nova linha inserida quando o usuário digita em uma nova universidade para a caixa de texto.

Se você quiser separar a lista fornecida daqueles adicionados por usuários, você pode ter uma coluna na tabela da Universidade com origem (ou de proveniência) dos dados.

Eu não tenho certeza se a questão é muito clara aqui.

Já fiz isso algumas vezes no trabalho e apenas escolher entre um ou outro na lista de uma caixa de texto para baixo. Se os dados são inseridos na caixa de texto, então eu primeira inserção no banco de dados e, em seguida, usar a identidade para obter o identificador exclusivo que linha inserida para mais consultas.

INSERT INTO MyTable Name VALUES ('myval'); SELECT @@SCOPE_IDENTITY()

Este é contra MS SQL Server 2008, porém, eu não tenho certeza se o @@ SCOPE_IDENTITY () existe global em outras versões do SQL, mas eu tenho certeza que há equivalentes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top