Come imporre il vincolo di partecipazione obbligatorio alle molte estremità in una relazione uno-a-molti?

6

Dire che ho il seguente diagramma ER:

Applicareilvincolodipartecipazioneobbligatorioaun'estremitàèfacile,facciosemplicementelachiaveesterna(school_id)inStudentNOTNULL.

Macomepossoapplicareilvincolodipartecipazioneobbligatorioallemolteestremità(ogniSchooldeveaverealmenounStudent),ovvero,comepossoevitarequalcosadelgenere:

Se ho inserito per prima una riga School , ovviamente non avrà Students .

E inoltre non posso inserire prima una riga Student con school_id che non esiste nella tabella School (il vincolo di integrità referenziale la impedirà) e quindi inserire una riga School (con lo stesso school_id ).

Nota: sto usando MySQL.

    
posta Tom 06.11.2016 - 22:33
fonte

3 risposte

2

Non è IMHO l'idea migliore che cerchi di applicare un simile vincolo attraverso un meccanismo di database, ti porterà in tutti i tipi di problemi come quello che hai già menzionato. Oppure, in parole diverse, evitare questo tipo di relazioni in un ERM.

Tuttavia, se davvero insisti per applicarlo, suppongo che tu possa farlo implementando alcuni trigger, impedendo l'inserimento diretto di nuove scuole o la cancellazione di studenti. Invece, è necessario fornire alcune stored procedure per l'aggiunta di nuove scuole solo in combinazione con uno studente e per rifiutare di cancellare l'ultimo studente di una scuola (o eliminare automaticamente la scuola quando l'ultimo studente viene cancellato). La prima di queste due procedure memorizzate deve disattivare temporaneamente i trigger per evitare il problema dell'uovo / gallina che hai menzionato.

    
risposta data 06.11.2016 - 23:07
fonte
0

In un modello concettuale tutto è possibile, ma in realtà questa relazione non può essere applicata a causa di questa situazione: non è possibile inserire uno studente perché la scuola non esiste e non è possibile inserire la scuola perché lo studente non esiste. Questo è il modo in cui la fine obbligatoria è sempre l'unilaterale.

Anche se nel tuo esempio suggerirei che nessuno dei due termini sia obbligatorio poiché gli studenti possono esistere a prescindere da una scuola e questo ti permetterebbe di inserire uno studente nel tavolo e rinviare l'assegnazione di una scuola per lui / lei.

    
risposta data 07.11.2016 - 00:59
fonte
0

Penso che lo farei con una vista.

realschools = select * from school inner join student on school.id = student.schoolId

Rinomina il tavolo della scuola in "potenziali scuolabus" o qualcosa del genere e il join interno significherà che non appena un potenziale scolastico non ha studenti scomparirà dalla vista della scuola

    
risposta data 08.11.2016 - 00:52
fonte

Leggi altre domande sui tag