Estou trabalhando no Access 2010.
Digamos que eu tenha um banco de dados que rastreie onde os pacotes ficam em um depósito.
Table: Packages
PackageID (PK)
PackageHeight
PackageWidth
PackageWeight
PackageOwner
(etc)
Agora quero mostrar a quais pacotes cada pacote está próximo.
Por exemplo, A está ao lado de B e M.
Table: PackageNextTo
ID (PK), PackageID (Packages.PackageID, FK), NextToPackageID(Packages.PackageID, FK)
1, A, B
2, A, M
Então, quando olho para cima A
, descubro que está ao lado de B
e M
.
Mas quando olho para cima B
, também quero descobrir que está ao lado de A
.... e quando olho para cima M, quero descobrir que está ao lado A
e também, por exemplo, ao lado de T
. (mas M e B não estão necessariamente um ao lado do outro). Devo definir esses relacionamentos explicitamente adicionando registros da seguinte maneira:
Table: PackageNextTo
ID (PK, AutoIncrement), PackageID, NextToPackageID
1, A, B
2, A, M
3, B, A
4, M, A
5, M, T
6, T, M
OU existe uma maneira de dizer automaticamente se x
está próximo a y
então y
está próximo a x
.
(OU uma maneira melhor de estruturar esses dados completamente!)
Em termos humanos, vejo redundância entre os registros 1 e 3 acima e entre 5 e 6 acima e assim por diante .... mas não sei se isso é redundante para um banco de dados ou se o banco de dados precisa disso explicitamente.
Se o banco de dados exigir isso explícito, existe uma maneira de executar uma macro ou consulta que criará automaticamente (B,A) quando (A,B) for definido?
Em sua
PackageNextTo
tabela proposta, "ID (PK)" parece ser uma chave substituta, presumivelmente um número automático. Embora eu não seja um advogado de chave substituto, conheço pessoas que as evitam em tabelas de relacionamento (tabelas de junção, tabelas de vinculação, o que quer que seja). Você certamente precisaria aplicar a chave candidata (composta) de(PackageID, NextToPackageID)
qualquer maneira e a presença doID
parece ter confundido pelo menos uma pessoa respondendo aqui. Portanto, sugiro que o omita.Para garantir que o relacionamento 'próximo a' seja armazenado unidirecionalmente, adicione uma
CHECK
restrição (ou regra de validação), por exemploPara mostrar todos os relacionamentos 'next to' como bidirecionais, expanda-os usando um
VIEW
(ou crie um objeto Query agrupado da maneira usual):Observe que
CHECK
eCREATE VIEW
requer ANSI-92 Query Mode .Crie uma visualização da seguinte maneira:
(esta é a sintaxe do Oracle e pode precisar ser modificada para o Access)
Você tem algum local onde os pacotes são armazenados (como número de prateleira/silo/etc)? Se o fizer, poderá ter uma tabela com locais e pacotes nesse local. Para encontrar os pacotes adjacentes, você precisa apenas saber o id do local +/-1 local. O ID do local precisaria ser único e sequencial.
Caso contrário, você poderia definir uma restrição (o que provavelmente significa usar um mecanismo de banco de dados mais poderoso do que o Access, talvez o SQL Server Express?) Em seguida, você poderia criar uma função de gatilho que verifique se o X próximo a Y == Y próximo para X em qualquer atualização.
Outra opção é criar uma estrutura de lista encadeada em sua tabela, de modo que o elemento de dados para X seja preenchido em seguida e Y e o elemento anterior para Y tenha X, com os campos anterior/próximo/atual tendo uma restrição exclusiva neles. Por exemplo
E, para ter certeza, coloque uma restrição ou função de gatilho para verificar se prevID corresponde ao nextID do elemento anterior.