Domanda

Sto facendo un database per un programma in cui dovrei modellare alcune relazioni in famiglia. es: X è il padre a Y, Y è il figlio di X

Quindi, ho un Utenti tabella con tutte le informazioni su ogni membro così ho pensato di fare una relazione molti a molti relazione tra il Utenti tavolo e se stessa in modo che il < strong> Member_Member tabella ponte sarà avente le colonne "FK_FromID, FK_ToID" come chiave composta (è questo corretto?) e forte come una chiave "FK_RelationType" estero RelationTypes tabella che avrà il tipo di relazione "Padre, madre, figlio, figlia", e due rapporti andando come uno a molti dalla tabella Utenti a queste due chiavi esterne

Il mio problema è : quando si eliminano se scelgo cascata allora io farò cicli, perché se elimino un membro di allora ci saranno due passaggi di eliminazione per i record correlati a Member_Member ponte, sapendo che nel programma ogni volta che inserisco un rapporto padre inserirò una relazione figlio pure nella tabella Member_Member, c'è un modo o una soluzione possibile attivare a cascata in modo che ogni volta che si elimina un membro io eliminare i record correlati in Member_member indipendentemente di essere registrato sia in un verso o dalla colonna chiave esterna

Quindi, non so cosa fare, si tratta di una corretta progettazione, in primo luogo o cosa? , Cosa devo fare di ciclismo, anche quello che pensi che un disegno migliore per lo stesso problema dovrebbe essere sapendo che ho bisogno di specificare che tipo di relazione tra le due parti

Grazie molto per qualsiasi aiuto, e scusa per il cattivo inglese Bishoy

È stato utile?

Soluzione

SQL non gestire i problemi della "rete" come questo molto bene.

Il tavolo da bridge membro-membro è un nome terribile. Si tratta di un "membro-parent" (o "padre-figlio") il ponte. tavoli da bridge non dovrebbero avere un "chiave composita". tavoli da bridge hanno una chiave surrogata (solo un numero sequenziale) e un paio di riferimenti FK ad altri tavoli. I due FK del dovrebbe avere nomi come "membro" e "genitore" per renderlo perfettamente chiaro quale sia il rapporto è in questa tabella.

Ognuno ha un genitore. Non tutti hanno i bambini. Alcuni genitori non avranno genitori in questo database; sono i "top genitori".

E 'più facile se i migliori genitori hanno righe nel ponte di genitore-bambino con un genitore FK NULL. In questo modo si evita di super-complesso esterno si unisce - ogni membro ha almeno una riga membro-genitore; idealmente due.

Troverete molti "bicicletta" problemi dal momento che i rapporti sono transitive.

Si noti che non è possibile - in una singola query SQL standard - trovare tutti i membri della famiglia, o di tutti i genitori Torna all'inizio della famiglia, o di tutti i bambini e nipoti. Ci sono estensioni SQL che rendono questo possibile, ma lo standard non gestisce bene.

La cascata di eliminazione non funziona bene perché le relazioni di una famiglia sono diretto in due modi (genitore di bambini, bambino ai genitori), ma SQL ha un solo tipo di direzione (di riferimento FK).

Si può cercare di assicurare che ogni membro deve avere almeno una (e al massimo due) righe di "membro-genitore" e l'eliminazione di un membro cancella le due file in "iscrizioni a genitore" e i tasti hanno i nomi propri, si potrebbe fare parte di questo lavoro.

Si noti che quando si elimina un membro, questo si romperà le relazioni genitore. Si elimina la riga membro genitore. Quello è buono. E i loro figli? Le altre righe che hanno membro genitore riferimento a questo genitore eliminato vengono ora rotti. Cosa significa questo? Cosa dovrebbe essere fatto?

  

Non c'è standard risposta. Eliminazione di righe da un grafo connesso foglie elementi   non connesso. Si deve lavorare fuori alcune regole sensate per questo.

Dato che SQL non lo fa bene, tutti i disegni saranno sembrano avere problemi.

Altri suggerimenti

  1. Supponendo che ogni membro può avere un solo madre e un padre, si sarebbe in grado di derivare tutte le relazioni, semplicemente mantenendo un campo mother_id e father_id nella tabella members.

    Informazioni Tuttavia questo sarebbe solo lavoro se il database non sarà sono mancanti. Ad esempio, se gli X è il fratello di membro Y, non ci sarebbe modo di sapere questo a meno che i genitori di X e Y sono memorizzati nel database.

    Se il database non sarà avere informazioni mancanti, quanto sopra potrebbe essere più facile da gestire l'integrità dei dati. Le query possono ottenere un po 'complesso però.

  2. Il ponte member_member hai suggerito ha un problema serio in quanto implica una direzione del rapporto, in modo che se X è il padre di Y, Y è anche il figlio di X. È suggerito per definire la relazione due volte in entrambe le direzioni, ma in generale questo non è raccomandato. Questa è una forma di duplicazione dei dati, e si può lottare per applicare l'integrità referenziale con la duplicazione dei dati. Ricordate che il DBMS non sa che X è il padre di Y è la stessa di Y è il figlio di X.

Sono consapevole che questa non è una risposta completa, ma solo un paio di osservazioni. Sono totalmente d'accordo con la S. Lott risposta come in non esiste un modo standard per "risolvere "questo con i database relazionali.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top