Una chiave esterna deve avere come target una chiave primaria o un vincolo univoco. È normale fare riferimento alla chiave primaria, perché in genere si desidera fare riferimento a una singola riga in un'altra tabella e la chiave primaria è l'identificatore di una riga della tabella.
Da un punto di vista tecnico, non importa se una chiave esterna fa riferimento alla chiave primaria oa un altro vincolo univoco, perché in PostgreSQL entrambi sono implementati allo stesso modo, utilizzando un indice univoco.
Per quanto riguarda i tuoi esempi concreti, non c'è niente di sbagliato nell'avere la size
univoca colonna di vehicle_size
essere l'obiettivo di una chiave esterna, anche se pone la domanda sul perché non hai creato size
la chiave primaria e omettere l'id
colonna del tutto. Non è necessario che ogni tabella abbia un id
colonna che è la chiave numerica primaria generata automaticamente, tranne per il fatto che potrebbero esserci ORM e altri software che lo prevedono.