Atualmente tenho uma entidade Ticket , agora pretendo criar outra entidade chamada TicketHistory assim como a imagem abaixo para acompanhar as alterações que aconteceram na entidade Ticket , gostaria de saber se essa é a maneira "correta" de projetar este caso?
Como criar um id único no Flutter para adicionar ao banco de dados no firebase?
Os dados
Digamos que eu tenha uma grade representando todas as pessoas em uma sala e as conversas que elas têm quando falam entre si.
John | Susana | Brian | Rachel | |
---|---|---|---|---|
John | Resseguro | Trabalhar | Esportes | Filmes |
Susana | Trabalhar | Resmungando | Viagem | Música |
Brian | Esportes | Viagem | Nada | Comida |
Rachel | Filmes | Música | Comida | Auto-depreciativo |
O banco de dados
Inicialmente considerei apenas fazer tabelas regulares de People
eConversations
A Conversations
mesa seria uma chave etopic
participant1
participant2
O dilema
A ordem dos participantes é totalmente irrelevante. Uma simples pergunta “Sobre o que Rachel e Brian conversam” torna-se uma consulta complicada de executar.
Portanto, uma de duas coisas deve ser feita:
- Dados redundantes são adicionados ao banco de dados: (Rachel e Brian) ou (Brian e Rachel)
- Uma consulta ridiculamente complicada é necessária para consultar os dados não redundantes porque você não sabe se Rachel é participante1 ou participante2.
Seguir com 1 acima cria um modelo de banco de dados O (n ^ 2) insustentável, enquanto 2 parece um pesadelo de DBA tentando consultar dados significativos.
A questão
Como faço para modelar uma estrutura de dados como esta? O SQL é a ferramenta certa para o trabalho ou devo pesquisar algo totalmente diferente?
Eu criei o modelo de dados conceituais e o modelo de dados físicos com estas informações:
Modelo de dados conceituais:
Modelo de dados físicos:
quero que 'Compra' tenha muitos 'Ticket'. Por exemplo, algo assim:
(PurchaseID, TicketID)
( 1 1 )
( 1 1 )
( 1 2 )
( 1 2 )
Isso pode corresponder a 'Uma compra com 4 ingressos, 2 ingressos de um tipo e 2 ingressos de outro tipo )
Como posso modelar corretamente?
Isso faz parte da pergunta da entrevista sobre o estacionamento, em que o candidato é solicitado a projetar o sistema de estacionamento. Projetar entidades para estacionamentos é um problema bastante discutido. Mas estou preso em uma parte em que temos que atribuir uma vaga de estacionamento a um veículo.
Digamos que estamos implementando o problema do estacionamento com armazenamento de dados externo. E há muitas solicitações simultâneas, solicitando vaga de estacionamento. A implementação básica é,
Crie uma linha de banco de dados separada para cada vaga de estacionamento, com disponibilidade de coluna verdadeiro/falso.
Sempre que um veículo chegar, encontre um slot disponível (digamos o ID do slot X)
Atualize a disponibilidade do banco de dados como falso com bloqueio otimista (ou seja, UPDATE se slotid=X e disponibilidade =false)
A abordagem acima não funcionará bem em cenários de alta simultaneidade, uma vez que o mesmo slot poderia ser alocado para vários veículos e a etapa 3 falharia para todos esses veículos e teríamos que tentar novamente a partir da etapa 2.
Para processar isso de maneira ideal, devo mesclar as etapas 2, 3 e descarregar a atribuição para o próprio banco de dados. E o novo fluxo deve ficar como abaixo
- Crie uma linha de banco de dados separada para cada vaga de estacionamento, com disponibilidade de coluna verdadeiro/falso.
- Sempre que um veículo chega, acione uma consulta sql para encontrar uma linha e atualize a disponibilidade para falso. E devolver o slotid ao veículo?
É possível fazer isso em bancos de dados SQL? Existem outras abordagens para alcançar essa funcionalidade.
Atualmente estou estudando uma unidade sobre desenvolvimento de banco de dados e estou em um módulo sobre normalização, acredito que este ERD completou a normalização da 2ª forma, pois cada tabela possui uma chave primária, todos os dados são atômicos e não há grupos repetidos, e Não acredito que haja qualquer dependência parcial de chave. Mas sou novo e meu entendimento ainda é fraco. Então, eu queria saber se alguém poderia dar uma olhada e me dizer o que pensa e, possivelmente, qualquer ajuda que eu agradeceria muito.
(Incluirei uma foto do ERD também, obrigado novamente)
Editar: não tenho certeza se devo raspar a tabela PostCodeAndCity e incluir os dados da cidade na tabela de endereços, mas isso foi sugerido pelos meus materiais de estudo.
Edit2: Por ter criado uma conta para esta pergunta, não tenho reputação de votar positivamente em suas respostas, mas só queria agradecer a todos que dedicaram seu tempo para compartilhar seu conhecimento, eu realmente aprecio isso e ajudou ainda mais meu muito!
é possível projetar um banco de dados com uma estrutura de árvore clássica (sem nested-set), forçando apenas 2 níveis?
a tabela que pensei que deveria ser:
eu ia | título | id_pai |
---|---|---|
1 | linha | NULO |
2 | criança | 1 |
3 | ERRO grand_child | 2 |
A terceira linha não deveria ser possível.
Posso conseguir isso sem gatilho ou sem qualquer linguagem de programação?
Esta é a minha primeira pergunta a este site, que diz que sinto muito se for uma duplicata, só não tenho educação suficiente para saber os termos corretos a serem usados para pesquisar esse conceito. Se tal conceito for um padrão conhecido, eu estaria grato se a resposta tivesse um nome para isso.
Agora, vamos à pergunta. Usarei postgres para os exemplos, mas fique à vontade para mostrar exemplos em outros bancos de dados, se necessário.
O esquema simplificado:
create table factory (
id serial primary key,
detail text not null
);
create table process (
id serial primary key,
detail text not null
);
create table item (
id serial primary key,
detail text not null
);
Por questões de brevidade, referir-me-ei à Fábrica como [F], ao Processo como [P] e ao Item como [I].
O esquema tem os seguintes relacionamentos conceituais:
- Cada Processo é exclusivo de uma Fábrica, então [P] n -> 1 [F]
- Cada Item é exclusivo de uma Fábrica, então [I] n -> 1 [F]
- Cada item pode ser feito por vários processos, então [P] n -> 1 [I]
para expressar essas relações criei uma tabela "factory_item_process":
create table factory_item_process (
factory_id integer not null references factory(id),
process_id integer not null references process(id),
item_id integer not null references item(id),
constraint pk_factory_item_process primary key (
factory_id, process_id, item_id
),
constraint uq_factory_item_process_process unique (process_id)
);
Isso cuida de [P] n -> 1 [I]
and [P] n -> 1 [F]
, mas não resolve [I] n -> 1 [F].
Cheguei à conclusão de que não há como transmitir [I] n -> 1 [F]
restrições de chave únicas, então criei uma função simples que verifica se [I] já pertence a um [F]:
create function in_other_factories(
factory_id integer,
item_id integer
) returns boolean
language sql returns null on null input
return true in (
select
true
from factory_item_process
where factory_id <> $1
and item_id = $2
);
alter table factory_item_process
add constraint chk_factory_item check(not in_other_factories(factory_id, item_id));
Tendo em mente que sou um novato, gostaria de perguntar: é factory_item_process
a maneira correta de expressar essas relações? Sinto que estou fazendo algo errado, mas não consigo entender.
Fazer uma verificação com uma função definida pelo usuário parece um cheiro de código, mas não consegui pensar em mais nada. Também não tenho certeza se as tabelas estão normalizadas corretamente.
desde já, obrigado
Editar em resposta à resposta do mustaccio: optei por usar outra tabela para esse relacionamento porque esse relacionamento terá atributos exclusivos dele mesmo.
O requisito é: Os usuários devem ser capazes de definir a estrutura do documento que desejam armazenar.
Por exemplo, um usuário pode decidir armazenar um extrato bancário com a seguinte estrutura:
- data_post (data)
- detalhes (texto)
- débito (número)
- crédito (número)
- data_valor (data)
- referência (texto)
em seguida, selecione um arquivo para carregar no banco de dados.
Outro usuário ou o mesmo usuário também pode carregar um documento diferente com uma estrutura diferente.
Se conhecermos todas as diferentes estruturas de documentos disponíveis, podemos criar todas as tabelas do banco de dados, mas o sistema deve ser tal que o usuário possa carregar qualquer tipo de documento, e definir suas próprias estruturas.
Estou procurando uma maneira de salvar todas as linhas dos documentos em uma única tabela, se possível. Ou devo criar dinamicamente uma nova tabela quando o usuário definir uma nova estrutura de documento para carregar? É este o melhor caminho?
Sou estudante de graduação e ainda não trabalhei com nenhum banco de dados, então peço desculpas se não entendi/utilizei mal algum termo. Minha pergunta vem de uma tarefa minha, mas esta é minha tentativa de aprender e não fazer o dever de casa para mim.
A tarefa, parafraseada:
O serviço de impressão de uma universidade permite que os alunos do campus carreguem seus arquivos no sistema e enviem os arquivos carregados para uma das impressoras da universidade para impressão... O sistema registra todas as impressões feitas por todos os alunos, registrando a identificação do aluno, qual impressora foi usada , o nome do arquivo de impressão, bem como a hora da impressão. Um administrador do sistema deve ser capaz de visualizar o arquivo de log filtrado para qualquer aluno, impressora e/ou período de tempo (que eu saiba, isso requer indexação).
Uma questão que me deparo é qual abordagem de armazenamento de dados (banco de dados ou sistema de arquivos) devo usar para os arquivos do aluno e o arquivo de log, sendo ambos dados de crescimento frequente.
A partir desta pergunta do SO, concluí que os arquivos de atualização freqüentes são melhor armazenados como armazenamento do sistema de arquivos e, a partir desta pergunta, os arquivos podem ser armazenados em um banco de dados com blobs.
Minhas perguntas são:
- O arquivo de log deve ser armazenado no banco de dados ou no sistema de arquivos? (Ou acho que a questão determinante seria "É possível filtrar por vários valores sem indexação?")
- Se os arquivos dos alunos forem armazenados com um blob relacionado a um aluno na tabela do banco de dados, é possível que cada aluno tenha acesso apenas aos seus próprios arquivos?
- Por que o sistema de arquivos é mais adequado para arquivos que crescem com frequência?
- É possível (ou prático) que um servidor use banco de dados e sistema de arquivos?