Gestire relazioni molte a molte con molti tipi diversi

2

Ho un nuovo requisito che per un dato User quanti veicoli può guidare. Al momento questa informazione deve essere mostrata come un elenco di veicoli. Possono esserci diversi tipi di veicoli, ad esempio:

Utente A

Auto

  1. SUV 1
  2. Toyota RED

Moto

  1. Fav Yellow
  2. Rocker blu

E così via ...

Gli utenti sono normalmente membri della famiglia, quindi condividono i veicoli e quindi l'associazione è molti a molti per utente e veicolo e in futuro potrebbero esserci molti più tipi di veicoli quindi, per ogni veicolo di cui ho bisogno cambia la mia Entità Utente e aggiungi un'associazione per ogni tipo di veicolo che sembra male.

Frammento di esempio:

class UserEntity {
  @ManyToMany()
  @JoinTable(...)
  Set<Car> cars = new HashSet<>();

  @ManyToMany()
  @JoinTable(...)
  Set<Bike> bikes = new HashSet<>();

  ...same for each type
}

In questo momento ho creato la mia tabella di associazione user_vehicle che contiene i seguenti tre campi:

ID | user_id | vehicle_id | VEHICLE_TYPE

L'applicazione è costruita su Spring e sto usando Spring data JPA ma non posso definire direttamente da molti a molti l'associazione dell'utente poiché contiene la colonna extra type nella mia tabella di associazione, quindi devo gestire manualmente le modifiche. Ad esempio, per creare un nuovo record, per prima cosa rimango l'entità principale e poi persisto questa entità figlio con l'ID dell'entità padre e lo stesso per l'aggiornamento. Questo mi sembra un accoppiamento visto che ogni nuovo sviluppatore ha bisogno di capire l'ordine corretto delle entità persistenti.

Ho la sensazione che ci sia qualche problema nell'approccio sopra, vorrei sentire dagli altri come potrebbero gestire questo requisito?

    
posta CodeYogi 08.11.2017 - 12:00
fonte

1 risposta

1

Da molte a molte relazioni sono di solito un segno che le entità richiedono un'ulteriore decomposizione. Nel caso che descrivi, quello che hai veramente è uno a molti. Una persona può guidare più di un veicolo.

Quindi la relazione è Person > PersonVehicle- > Vehicle

PersonVehicle conterrebbe solo l'elenco delle chiavi della persona e del veicolo. La chiave primaria sarebbe in genere una chiave composta costituita dalle due chiavi.

EDIT: esempio lavorato

Ho fornito un esempio di ciò che ho descritto di seguito. In sostanza, questo decompone i molti a molti in due da uno a due.

Persona (chiave, descrizione)

1, Lance

2, Bill

PersonVehicle (persona chiave, chiave veicolo)

1,1

1,2

2,1

2,2

Veicolo (chiave, descrizione)

1, Humvee

2, Jeep

    
risposta data 08.11.2017 - 12:46
fonte