2012-08-02 21 views
6

Sto facendo un database di studenti in una school.Here è quello che ho finora: enter image description hereCome rendere una chiave composta unica?

Se non ti piace leggere salto al "In breve" parte

Il problema è che non sono contento di questo design. Voglio che la combinazione di, subgrade e id_class sia univoca e che funga da chiave primaria per la tabella degli studenti. Posso rimuovere lo student_id e creare una chiave composta dal 3 ma non voglio neanche quello. Forse dovrei fare un altro tavolo per dire combination_id dove grade, subgrade e id_class sono chiavi esterne e c'è una colonna in più comb_id che funge da ID per la tabella. E tutte le colonne saranno chiavi primarie. Ma il problema è che quelle 3 colonne possono ancora ripetersi a causa di quella colonna aggiuntiva (comb_id). Ad esempio, posso avere lo stesso, subgrade e class_id ma diverso comb_id che renderà la riga valida a causa della chiave composta delle 4 colonne della tabella (combination_id).

Insomma voglio students_id di rimanere l'unica chiave primaria della tabella, ma per essere una chiave esterna a un'altra tabella, che è in qualche modo combinazione unica di grades, subgrade e class_id.

Se non fossi abbastanza chiaro, chiedi nei commenti qui sotto e grazie in anticipo.

PS mi dispiace per il titolo indescriptive ma sono male a denominazione

EDIT 1: Per essere più chiari: grade può essere da 1 a 12 subgrade può essere un a j id_class può essere da 1 a 30 ed è il vostro numero in classe

Così uno studente può essere da 7b classe e il suo numero in classe - 5

+0

Non capisco, tutti gli studenti di una classe si sono arruolati per avere voti diversi? – Jodrell

+0

Cosa farai quando gli studenti cambiano classe o, non succede mai? – Jodrell

+0

Cosa c'è di sbagliato in una colonna 'student_id'? – Jodrell

risposta

17

Non mescolare i concetti di chiavi univoche e chiavi primarie. Puoi benissimo aggiungere uno unique key che copre le tre colonne grades, subgrade e class_id. In questo modo, non esistono due righe could have gli stessi valori per queste tre colonne. Mentre scrivi che non vuoi avere questi tre come una chiave primaria composta, non sono sicuro che una chiave supplementare univoca composita sarebbe meglio. In caso contrario, dovrai chiarire quando le chiavi composite sono accettabili.

Per creare una chiave univoca, è possibile utilizzare il seguente SQL statement:

ALTER TABLE students ADD UNIQUE gsc (grades, subgrade, class_id); 

La parola gsc c'è solo un nome che ho fatto fino dalle iniziali delle colonne chiave; usa qualsiasi nome tu voglia, dato che difficilmente importa se non vuoi identificare la chiave in qualche output EXPLAIN o simile.

+0

grazie Ci proverò e probabilmente ho confuso le persone con i nomi di 'grado',' subgrade' e 'id_class', ma nel mio paese il sistema educativo è diverso. – Bosak

+0

OK Ho provato, ma quando ho reso tutte le 3 colonne 'UNIQUE' ho ricevuto un errore per le voci duplicate. Avevo molti 'gradi' 3 ma avevano diversi' sottoprogrammi' quindi li trattava come chiavi 'unique' separate. Inoltre cosa è supplementare? – Bosak

+0

Non rendere tutte le colonne univoche da sole, ma insieme: 'ALTER TABLE students ADD UNIQUE gsc (gradi, subgrade, class_id)'. 'gsc' è solo un nome, usa quello che vuoi. Quindi i duplicati si verificano solo se tutti e tre sono uguali. Ho usato il termine * supplementare * rispetto a * primario *: una chiave definita utilizzando questo comando non è primaria, ma è ancora unica. – MvG

2

Non sono del tutto chiaro perché vuoi ciò che hai descritto, ma guarderei il modello nel modo seguente ...

Si hanno Studenti
- Sono entità distinte, non un composito di altri enti
- Hanno le loro proprietà; nome, data di nascita, ecc

Si hanno classi
- Si tratta di gruppi di studenti
- Ogni anno accademico la stessa "classe" ha studenti differenti in esso
- Essi hanno anche le loro proprietà; grado, sub-grade, ecc

Hai una proprietà in più nel modello che io normalmente non utilizzare
- Se una classe ha 20 studenti, ognuno dei quali è identificato con un ID secondario da 1 a 20


Questo darebbe mi seguenti tabelle dimensionali

Student     Class      Grade    SubGrade 
----------------------- ------------------------ ----------------- ----------------- 
id   INT PK  id   INT PK  id INT PK  id INT PK 
first_name VARCHAR(45) name   VARCHAR(45) name VARCHAR(45) name VARCHAR(45) 
last_name VARCHAR(45) grade_id  INT FK  desc VARCHAR(45) desc VARCHAR(45) 
etc, etc     subgrade_id INT FK  etc, etc   etc, etc 

La Class tavolo w potrebbe avere un vincolo univoco su (grade_id, subgrade_id) in modo che solo una classe possa mai essere 7b.

Quindi è necessario mettere in relazione gli studenti alle loro classi utilizzando una tabella dei fatti ...

Class_Membership 
----------------------- 
id    INT PK 
student_id  INT FK 
class_id   INT FK 
academic_year INT 

Se uno studente dovrebbe essere sempre e solo in una classe, in ogni anno accademico, si dovrebbe mettere un vincolo univoco su (student_id, academic_year).

In alternativa, è possibile avere l'anno accademico nella tabella Class. Ciò significherebbe che avresti la stessa classe ripetuta per ogni anno, ma che in alcuni anni la classe 7g potrebbe non esistere (poiché ci sono meno studenti quell'anno, ad esempio).

Allo stesso modo, è possibile avere studenti che passano da 7b a 7c a metà anno. In questo caso la tabella Class_Membership potrebbe avere un campo start_date e possibilmente un campo end_date.


Niente di tutto questo, però, crea direttamente il id_class campo (1-20 per una classe con 20 studenti). Personalmente non avrei questo campo, il campo id dalla tabella Class_Membership può offrire la maggior parte delle stesse funzionalità e probabilmente funzionalità aggiuntive. Dove si è necessario, tuttavia, si potrebbe semplicemente aggiungere alla tabella Class_Membership ...

Class_Membership 
----------------------- 
id    INT PK 
student_id  INT FK 
class_id   INT FK 
academic_year INT 
class_member_id INT 

allora si potrebbe anche avere un vincolo univoco su (academic_year, class_id, class_member_id).


C'è un bel po 'di flessibilità qui, a seconda del-mondo-modello reale esatto e le vostre particolari esigenze.Ma spero che questo esempio sia un buon inizio per te; Tabelle di quotatura che elencano Entità e una tabella di fatti (o tabelle) che collegano queste entità insieme e/o descrivono ulteriormente le Entità.

+1

Mentre cerchi lo schema così com'è, aggiungerò qui i miei pensieri. @Bosak, a mio avviso il "sottofondo" è solo una lettera per distinguere classi diverse nello stesso grado. Quindi, mentre il grado e il sottotipo identificano una classe, un sottotipo di per sé non è realmente un'entità. Raramente sarai interessato a "tutte le classi con subgrade b", e ancor meno interessato a memorizzare attributi comuni per tutte quelle classi b, giusto? In tal caso, rilasciare la tabella SubGrade. – MvG

0
alter table <TableName> add constraint <ConstraintName> unique(<col1>, <col2>) 

Modified the answer due to syntax mistakes. Mentioned above is correct. 
Problemi correlati