AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 10408
Accepted
maneesha
maneesha
Asked: 2012-01-10 13:18:26 +0800 CST2012-01-10 13:18:26 +0800 CST 2012-01-10 13:18:26 +0800 CST

Se A está ao lado de B, como afirmar automaticamente que B está ao lado de A

  • 772

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 Be 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 Ae 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 xestá próximo a yentão yestá 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?

database-design ms-access
  • 3 3 respostas
  • 165 Views

3 respostas

  • Voted
  1. Best Answer
    onedaywhen
    2012-01-11T03:56:50+08:002012-01-11T03:56:50+08:00

    Em sua PackageNextTotabela 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 do IDparece 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 CHECKrestrição (ou regra de validação), por exemplo

    CREATE TABLE PackageNextTo
    (
     PackageID CHAR(1) NOT NULL 
        REFERENCES Packages (PackageID)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
     NextToPackageID CHAR(1) NOT NULL 
        REFERENCES Packages (PackageID)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
     CHECK (PackageID < NextToPackageID), 
     UNIQUE (PackageID, NextToPackageID)
    );
    

    Para mostrar todos os relacionamentos 'next to' como bidirecionais, expanda-os usando um VIEW(ou crie um objeto Query agrupado da maneira usual):

    CREATE VIEW AdjacentPackages
    AS
    SELECT PackageID AS PackageID_1, 
           NextToPackageID AS PackageID_2
      FROM PackageNextTo
    UNION
    SELECT NextToPackageID AS PackageID_1, 
           PackageID AS PackageID_2
      FROM PackageNextTo;
    

    Observe que CHECKe CREATE VIEWrequer ANSI-92 Query Mode .

    • 2
  2. Leigh Riffel
    2012-01-10T13:43:42+08:002012-01-10T13:43:42+08:00

    Crie uma visualização da seguinte maneira:

    SELECT ID, PackageID, NextToPackageID FROM PackageNextTo
    UNION ALL
    SELECT ID, NextToPackageID, PackageID FROM PackageNextTo
    

    (esta é a sintaxe do Oracle e pode precisar ser modificada para o Access)

    • 1
  3. adam f
    2012-01-10T14:12:39+08:002012-01-10T14:12:39+08:00

    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

    Table: Packages
    PackageID (PK)
    PrevPackageID (unique, allow null)
    NextPackageID (unique, allow null)
    PackageHeight
    ….
    

    E, para ter certeza, coloque uma restrição ou função de gatilho para verificar se prevID corresponde ao nextID do elemento anterior.

    • 0

relate perguntas

  • Os índices filtrados podem ajudar a melhorar as consultas baseadas em uma hora inserida ou isso deve ser evitado?

  • Qual é a diferença entre os tipos de dados MySQL VARCHAR e TEXT?

  • É melhor armazenar os valores calculados ou recalculá-los a pedido? [duplicado]

  • Armazenar vs calcular valores agregados

  • Quais são algumas maneiras de implementar um relacionamento muitos-para-muitos em um data warehouse?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve