Domanda

Ho alcuni tavoli che traggono vantaggio da molti a molti tavoli. Ad esempio la tabella del team.

Il membro del team può contenere più di una "posizione" nella squadra, tutte le posizioni sono elencate nella tabella delle posizioni. Le posizioni precedenti detenute sono anche memorizzate per questo ho una tabella separata, quindi ho

  • tabella dei membri (contenente i dettagli del team)
  • tabella delle posizioni (contenente le posizioni)
  • tabella member_to_positions (id del membro e id della posizione)
  • member_to_previous_positions (id del membro e id della posizione)

Semplice, tuttavia il punto cruciale arriva ora che un membro del team può appartenere a molti team. Ho già una tabella di ricerca team_to_member. Ora il problema arriva: come legare una posizione a una squadra? Un membro può essere stato il caposquadra di una squadra, ed è attualmente il responsabile della radio e l'addetto stampa di una squadra diversa. Come faccio a estrarre le informazioni per membro per mostrare la sua posizione attuale, ma anche la sua storia passata, inclusi i team precedenti. Devo aggiungere una posizione_ alla tabella del team e in qualche modo un riferimento incrociato, oppure posso aggiungere la squadra al membro alla tabella delle posizioni?

È tutto molto confuso, questa normalizzazione.

È stato utile?

Soluzione

È perfettamente legittimo avere una tabella TeamPositionMember, con le colonne

Team_Id
Position_Code
Member_Id
Start_Date
End_Date NULLABLE

E una colonna ID surrogata per chiave primaria, se lo si desidera; altrimenti è una chiave primaria composita a 3 campi. (Avrai comunque bisogno di un vincolo di unicità su questo.)

Con questa disposizione, puoi avere una squadra con qualsiasi set di posizioni. Una squadra può avere zero o più persone per posizione. Una persona può riempire zero o più posizioni per zero o più squadre.

EDIT:

Se vuoi le date, rivedi come mostrato sopra e aggiungi Start_Date al PK per consentire alla stessa persona di mantenere la stessa posizione in momenti diversi.

Altri suggerimenti

Sì, una tabella di giunzione molti-a-molti può avere attributi aggiuntivi (colonne).

Ad esempio, se esiste una tabella denominata tabella PassengerFlight codificata da PassengerID e FlightID, potrebbe esserci una terza colonna che mostra lo stato di un determinato passeggero su un determinato volo. Due stati diversi potrebbero essere "confermati". e "aspetta elencato", ciascuno codificato in qualche modo.

Inoltre, possono esserci relazioni ternarie, relazioni che coinvolgono tre entità e non solo due. Queste tabelle avranno tre chiavi esterne che insieme sono la chiave primaria per la tabella delle relazioni.

Il mio primo pensiero:

Assegna una colonna ID ai tuoi numerosi team / membri. Ogni relazione squadra-membro ora ha un ID.

Quindi crea molte posizioni di collegamento tra le relazioni con i membri del team.

In questo modo, i team possono avere più membri, i membri possono avere più team e i membri possono avere più posizioni in base al team.

Ora tutto è bello e SECCO, e tutto il collegamento sembra funzionare. Suona bene a chiunque altro?

Sembra che tu abbia bisogno di molte-a-molte posizioni al tavolo delle squadre ora.

La tua tabella team_to_member può effettivamente avere una colonna aggiuntiva position_id per descrivere (o in questo caso indicare) la posizione che il membro ha all'interno di quella squadra.

Elimina la tabella member_to_previous_position . Basta usare member_to_positions e avere queste colonne:

MemberToPositionID (autoincrement OK only)
MemberID
PositionID
StartDate
EndDate

Quindi per trovare le posizioni correnti, fai:

select * 
from member_to_positions 
where EndDate is null
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top