Projeto banco de dados sobre as entradas dinâmicas - Uma linha ou várias linhas?

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

  •  06-07-2019
  •  | 
  •  

Pergunta

Eu estive tentando projetar um esquema de banco de dados para um projeto paralelo, mas eu havent sido capaz de produzir qualquer coisa que eu estou confortável com. Estou usando ASP.Net com LINQ para o meu acesso a dados:

Eu estou indo para permitir aos usuários especificar até 10 "itens" cada um com 2 propriedades numéricas e 1 imóvel referencial, o nome do item.

Se eu fosse colocar esta entrada em 1 linha, seria facilmente igualar a alguns 30+ colunas (mínimo), por exemplo item_1_name (ref) item_1_weight item_1_volume item_2_name ... etc ...

E eu não posso simplesmente ligar estas colunas em tabelas referenciais como cada propriedade pode essencialmente variam 1-400 +.

Eu também percebi que se um usuário só decide colocar um item para a sua entrada, o método do qual eu criar o objeto para que os dados vai ser estático como com LINQ eu teria que verificar se as propriedades e outros enfeites são NULL e trabalhar em conformidade. Além disso, se eu sempre quis aumentar o número de itens permitidos em uma entrada, que seria uma dor de cabeça para trabalhar.

A outra opção que eu pensava é simplesmente a criação de uma linha para cada item e amarrando-o com um ID de entrada. Então eu basicamente nunca tem entradas nulas, mas minha mesa iria crescer astronomicamente profunda, mas não muito ampla, como haveria apenas cerca de 5 colunas ímpares.

Existe algo que eu estou com vista na minha concepção / há uma maneira muito melhor e eficiente de fazer isso?

EDIT: Quando eu digo que ela vai crescer astronomicamente, quero dizer que neste sentido: um usuário pode criar uma entrada, e cada entrada provavelmente vai ter um grupo de itens. Assim dizem eles fazem uma entrada de um dia para o site, eles poderiam ter 3 grupos de itens, com o número máximo de itens (10), o que equivale a 30 itens para que a única entrada. Faça um diário de entrada por uma semana a essa taxa e você poderia ter 210 linhas para esse único usuário.

Foi útil?

Solução

Eu recomendo o último projeto que você menciona, criar uma tabela dependente com cinco colunas:

CREATE TABLE Items (
  user_id               INTEGER NOT NULL,
  item_id               INTEGER NOT NULL DEFAULT 1,
  numeric_property1     INTEGER,
  numeric_property2     INTEGER,
  referential_property  INTEGER,
  PRIMARY KEY (user_id, item_id),
  FOREIGN KEY (user_id) REFERENCES Users(user_id)
                        ON DELETE CASCADE,
  FOREIGN KEY (item_id) REFERENCES num_items(item_id),
  FOREIGN KEY (referential_property) REFERENCES some_other_table(some_column)
);

Eu mostro um num_items tabela acima, que contém os números de 1 a 10 se você quiser restringir os usuários para 10 itens de maior:

CREATE TABLE num_items (item_id INTEGER NOT NULL );
INSERT INTO num_items (item_id) 
  VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);

As vantagens deste projeto é que é fácil COUNT() quantos itens um determinado usuário, é fácil coisas computação como MIN() e MAX() para uma determinada propriedade, você pode aplicar uma chave estrangeira para a propriedade referencial, etc.

Alguns bancos de dados possuem um recurso para declarar a segunda parte de uma chave primária composta (item_id neste caso) como auto-incrementando, assim, se você especificar o valor para entity_id mas omitem item_id ele automaticamente recebe o próximo valor não utilizado (mas faz não preencher as lacunas se você excluir um). Você não indicar qual marca de banco de dados que você está usando, então eu vou deixar para você descobrir este recurso.

Editar: Como Tony Andrews diz em sua resposta, o número de linhas não é um problema. Você não estatal qual marca de banco de dados você está pretendendo usar, mas a menos que você escolher um produto especialmente débil como MS Access, você pode contar com o banco de dados de milhões de processos de linhas facilmente. Se você escolher índices bem, e consultas de escrita que usam esses índices, a eficiência não deve ser um problema.

Outras dicas

usar uma única tabela de itens:

userId, itemIndex, isReference, ValorNumerico, referenceValue

Desta forma, o valor para item_3_name para o utilizador 999 traduz a

999,3, verdadeiro, null, o valor

Você terá que cumprir certas restrições mesmo, S.A o número máximo de itens por usuário, etc.

O projeto adequado de banco de dados seria armazenar cada usuário / item em uma linha separada. Isso será muito mais fácil trabalhar com, e remove a restrição arbitrária de 10 itens. Eu não diria que ela vai crescer "astronomicamente profunda", haverá cerca de 10 x (no. De usuários) linhas.

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