Domanda

Sto cercando di modellare il posizionamento delle parti su un circuito. Senza alcun vincolo significativo, il mio schema di base sembra questo:

create table part (
    part_id bigserial primary key,
    name text not null,
    width double precision not null,
    height double precision not null
);
create table board (
    board_id bigserial primary key,
    width double precision not null,
    height double precision not null
);
create table board_part (
    board_id bigint not null references board,
    part_id bigint not null references part,
    position point not null
);

(Violino SQL, Visualizzazione)

Per b e b2 qualunque board_partS, voglio far rispettare i seguenti vincoli:

  1. b si trova sul tabellone:

    box(b.position, point(b.part.width,b.part.height))
        <@ box(point(0,0), point(b.board.width,b.board.height))
    
  2. b e b2 Non sovrapporre se si trovano sulla stessa tavola:

    b.board_id != b2.board_id or
    not (box(b.position, point(b.part.width,b.part.height))
            && box(b2.position, point(b2.part.width,b2.part.height)))
    

Come posso raggiungere questo obiettivo (senza troppa duplicazione dei dati)? Cambiare lo schema va bene.

Qui è Il mio miglior tentativo (violino SQL), prendendo ispirazione da Erwin Rispondi alla mia domanda precedente. Applica i vincoli che volevo, ma ha molti dati duplicati in board_part tavolo. Immagino di poter scrivere una funzione per riempire il board_width, board_height, part_width, e part_height Fields automaticamente, ma sembra ancora sbagliato avere così tanti dati duplicati in giro. Inoltre, chiave per il width/height Fields sembra un hack.

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top