Rettangoli non sovrapposti vincolati a un confine
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_part
S, voglio far rispettare i seguenti vincoli:
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))
b
eb2
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