Modello dati: ereditarietà

1

Ho appena iniziato a lavorare su un progetto in cui sto cercando di implementare alcune logiche di backend che includono la creazione di un modello di dati per il problema specificato. Ecco un problema che ho riscontrato e sono curioso di sapere quale approccio sarebbe più adatto per affrontarlo.

Modello: Ci sono vari utenti nel sistema con diversi diritti e strutture ma esiste un'eredità molto semplice tra di loro.

Esiste un user di base che può sfogliare e visualizzare alcuni dati, commenti di psot ecc. C'è un member che può fare tutto il user può + qualcosa in più e condividono le strutture di dati di base + member ha il suo. E c'è un producer che è di nuovo solo un'estensione di member .

Ogni user può (ma non deve) essere un member e ogni member può (ma non deve) essere un producer .

1) La mia idea attuale:

Crea tabella user e tabelle member e producer che si farebbero riferimento l'un l'altro utilizzando l'id dell'utente. Ci sarebbe una relazione da 0 a 1 tra queste tabelle:

USER {
id
username
email etc..
}

MEMBER {
userid
some_member_attributes
}

PRODUCER {
userid
some_producer_attributes
}

Il vantaggio è che mi avrebbe salvato un sacco di valori NULL in un singolo tavolo e mi sembra in qualche modo naturale. Il disadvatage è che dovrei interrogare tre diverse tabelle ogni volta che vorrei ottenere alcuni dati da un producer .

2) L'altra possibilità è implementarla come una tabella con attributi isMember e isProducer . Ma di nuovo, questo produrrà molti valori NULL poiché la maggior parte degli utenti non sarà producers . E non è molto tipico avere molte relazioni 0-1 in un modello, penso ...

Che cosa suggerisci? Spero che non sia fuori tema qui, sto solo cercando di farlo bene, quindi non dovrò reimplementare una dozzina di volte in futuro. Grazie per eventuali suggerimenti!

    
posta Smajl 29.07.2014 - 09:11
fonte

2 risposte

2

Il tuo modello di dati sembra un po 'insufficiente. Qualcuno che ha effettuato l'accesso può senza dubbio essere un utente oggi, un membro la settimana prossima e un produttore l'anno prossimo. Questo suggerisce che l'eredità è la strada sbagliata. È necessario disporre di una tabella utente connessa, collegata a una tabella secondaria che distribuisce i diritti del produttore e dei membri in un periodo di tempo definito.

Peter Coad ha svolto un eccellente lavoro in questo campo: effettua una ricerca su Google con il suo nome.

    
risposta data 29.07.2014 - 10:16
fonte
0

La tua risposta preferita ha un nome nella letteratura. Cerca Ereditarietà delle tabelle di classe . La soluzione a tavolo singolo ha anche un nome. Cerca Eredità tabella singola

Quale è meglio dipende dal caso d'uso.

Nella tua risposta, hai anche fatto uso di una tecnica nota come Chiave primaria condivisa

La chiave primaria condivisa può essere molto utile in combinazione con l'ereditarietà della tabella delle classi. Applica la natura 1-a-1 della relazione sottoclasse / classe e fornisce le chiavi per join semplici e veloci.

Se codificare i join diventa un fastidio, codifica i join nelle viste. Puoi anche codificare una vista che è l'unione di tutte le viste delle sottoclassi e dà l'aspetto di una singola ereditarietà di tabelle, con tutti quei brutti NULL.

Sto solo convalidando ciò che hai già inventato da solo. Ma potrebbe essere utile sapere che altri hanno pensato allo stesso modo.

    
risposta data 29.07.2014 - 12:30
fonte

Leggi altre domande sui tag