Une clé étrangère doit cibler une clé primaire ou une contrainte unique. Il est normal de faire référence à la clé primaire, car vous souhaitez généralement référencer une ligne individuelle dans une autre table, et la clé primaire est l'identifiant d'une ligne de table.
D'un point de vue technique, peu importe qu'une clé étrangère référence la clé primaire ou une autre contrainte unique, car dans PostgreSQL les deux sont implémentées de la même manière, en utilisant un index unique.
Quant à vos exemples concrets, il n'y a rien de mal à avoir l'unique size
colonne de vehicle_size
être la cible d'une clé étrangère, même si cela soulève la question de savoir pourquoi vous n'avez pas fait size
la clé primaire et omettre le id
colonne tout à fait. Il n'est pas nécessaire que chaque table ait un id
colonne qui est la clé primaire numérique générée automatiquement, sauf qu'il peut y avoir des ORM et d'autres logiciels qui attendent cela.