MySQL]: Visualização da tabela ou tabela real. (rastreando uma chave primária)
-
22-09-2019 - |
Pergunta
Eu tenho um banco de dados que possui as seguintes relações:
Transaction->Purchase->Item->Schedule
Transaction - self explanitory
Purchase - any purchase info that relates to the item being purchased (quantity, if the user purchases more than one item). A given Transaction can have more than one Purchase_ID tied to it.
Item - Stores Item info and relates it to individual clients.
Schedule - determines the price of an item at a given time of day.
Preciso executar uma consulta que deve selecionar uma série de valores do cronograma com base em se Transaction.TimeStamp
está dentro de uma faixa de data fornecida. A consulta precisa selecionar um valor do cronograma com base na chave primária. A chave primária não é rastreável da transação.
Para resolver esse problema, decidi criar uma tabela para vincular a transação diretamente ao Primário do Agendamento.
Recentemente eu descobri Visualizações da tabela - Essa seria uma situação apropriada para fazer uma tabela "Visualização"? Ou devo apenas criar uma tabela 'real' TransactionSchedule
?
transactionSchedule
Transaction_ID Schedule_ID
Meu problema é que não entendo as especificidades de quando uma visualização de tabela é útil/quais são os benefícios.
Ter uma tabela individual para rastrear transação-> cronograma de agenda?
Realmente qualquer orientação geral com esse problema seria muito apreciada.
EDITAR: Esta consulta é apenas para recuperar dados que já foram inseridos
--obrigado
Solução
Peço fortemente que você copie o preço da programação diretamente para comprar assim que estiver inserindo isso. Dessa forma, você resolveu seu problema e, ao mesmo tempo, impediu um preço diferente sendo cobrado para o cliente mais tarde, se você acidentalmente (ou intencionalmente) alterar o cronograma.
Quanto a se relacionar com a chave principal do cronograma, e isso não é rastreável a partir de uma transação: isso é um sinal de design ruim. Quero dizer, pense sobre isso - você tem um registro de data e hora na transação, uma programação por definição é colocada a tempo usando um de e para o timestamp - por que você não pode relacioná -los? Afaios, a chave primária de cronograma deve ser item_id, from_timestamp, to_timestamp
Supondo
SELECT ..your columns..
FROM Transaction t
INNER JOIN Purchase p
ON t.id = p.transaction_id
INNER JOIN Item i
ON p.id = i.purchase_id
INNER JOIN Schedule s
ON i.id = s.item_id
AND t.timestamp BETWEEN s.from_timestamp
AND s.to_timestamp
Quanto a você usar uma visão ou não - realmente, depende de você. Uma visualização não funciona melhor ou pior que uma consulta, a única diferença é que a definição é armazenada no banco de dados. As principais vantagens disso são
- As pessoas podem reutilizar a definição sem copiar a consulta (e estragar tudo), o
- Você pode alterar o esquema até certo ponto e ocultá -lo do aplicativo, desde que você atualize a visualização de acordo (esta última vantagem é frequentemente superestimada)
Outras dicas
O registro de transação não pode ter uma chave estrangeira vinculada à chave primária do cronograma? Ou é um relacionamento muitos para muitos. De qualquer maneira, não vejo a visualização conforme apropriado aqui.