Come fare una chiave composta da unico?

Sto facendo un database di studenti in una scuola.Ecco ciò che ho finora:
Come fare una chiave composta da unico?

Se non ti piace leggere salto “In breve” parte

Il problema è che io non sono felice con questo disegno. Voglio la combinazione di grade, subgrade e id_class di essere unici e di servire come chiave primaria per la tabella studenti.
Posso rimuovere il student_id e fare una chiave composta da 3 ma non voglio che sia. Forse dovrei fare un’altra tabella permette di dire combination_id dove grade, subgrade e id_class sono chiavi esterne e c’è una colonna extra comb_id che serve come ID della tabella. E tutte le colonne saranno le Chiavi Primarie. Ma il problema è che quei 3 colonne può ancora ripetere, perché di quella colonna supplementare (comb_id). Per esempio posso avere lo stesso grade, subgrade e class_id ma diversi comb_id che faranno la fila valido a causa della chiave composta di 4 colonne della tabella (combination_id).

In breve voglio students_id di rimanere la sola chiave primaria della tabella ma per essere una chiave esterna verso un altro tavolo, che è in qualche modo unica combinazione di grades, subgrade e class_id.

Se non sono stato chiaro basta chiedere nei commenti qui sotto e vi ringrazio in anticipo.

PS mi dispiace per il indescriptive titolo, ma sto male a denominazione

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

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

Non capisco, sono a tutti gli studenti in una classe garaunteed avere diversi gradi?
Cosa fare quando gli studenti cambi di classe o, questo non è mai accaduto?
Cosa c’è di sbagliato con un student_id colonna?
Sono gli studenti in appena 1 classe, come un primario/junior/scuola materna?
Ho modificato la mia domanda per essere più chiari su queste colonne. E voglio student_id essere un FK da un’altra tabella che contiene le 3 colonne che servono come chiave composta. Se hai ancora domande chiedi

InformationsquelleAutor Bosak | 2012-08-02

3 Replies
  1. 19

    Non mischiare i concetti di chiavi univoche e chiavi primarie. Si può benissimo aggiungere un la chiave unica che abbracciano le tre colonne grades, subgrade e class_id. In questo modo, senza due righe potrebbe avere gli stessi valori per queste tre colonne. Come si scrive che non si desidera avere queste tre come una chiave primaria composta, e non so se un composito unico supplementare chiave sarebbe meglio. Se non, dovrete chiarire quando composito tasti sono accettabili.

    La creazione di un unico tasto, è possibile utilizzare il seguente SQL istruzione:

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

    La parola gsc c’è solo un nome che mi è composto dalle iniziali delle colonne chiave; utilizzare qualsiasi nome che si desidera, come poco importa se non si desidera identificare la chiave in alcuni EXPLAIN uscita o simili.

    grazie proverò e probabilmente ho confuso le persone con il nameings di grade, subgrade e id_class, ma nel mio paese il sistema di istruzione è diverso.
    OK ho provato ma quando ho fatto tutte e 3 le colonne UNIQUE ho ottenuto un errore di voci duplicate. Ho avuto molti grades 3, ma sono state diverse, subgrades così trattata separatamente unique chiavi. Inoltre che cosa è supplementare?
    Non fare di tutte le tre colonne unica da soli, ma insieme: ALTER TABLE students ADD UNIQUE gsc (grades, subgrade, class_id). gsc è solo un nome, usare quello che si vuole. Poi duplicati verificarsi solo se tutti e tre sono la stessa cosa. Ho usato il termine supplementare anziché primaria: Una chiave definita utilizzando questo comando non è primario, ma ancora unico.
    Grazie ha funzionato questo è quello che volevo 😀

    InformationsquelleAutor MvG

  2. 3

    Io non sono assolutamente chiaro sul motivo per cui si desidera quello che hai descritto, ma vorrei guardare il modello nel modo seguente…

    Hai gli Studenti

    – Sono entità distinte, non è un composito di altri enti

    – Hanno una loro proprietà; il nome, la data di nascita, ecc

    Si hanno classi

    – Questi sono gruppi di studenti

    – Ogni anno accademico la stessa “classe” ha diversi studenti in essa

    – Hanno anche loro proprietà; grado, sub-grade, ecc

    Si dispone di un extra di proprietà nel modello che io normalmente non uso

    – Se una classe di 20 studenti, ognuno di essi è identificato con un id secondario da 1 a 20

    Questo darebbe mi le seguenti tabelle di Dimensione

    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

    Il Class tavola un unico vincolo (grade_id, subgrade_id) in modo che solo una classe potrebbe mai essere 7b.

    Allora avete bisogno di relazionarsi con gli studenti delle 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 sempre e solo essere in una classe in ogni anno accademico, si dovrebbe mettere un vincolo univoco (student_id, academic_year).

    In alternativa, si potrebbe avere l’anno accademico in Class tabella. Questo significa che si dovrebbe avere la stessa classe ripetuta per ogni anno, ma che in alcuni anni classe 7g non esiste (come ci sono meno studenti di quell’anno, per esempio).

    Altrettanto, si potrebbe avere studenti che si spostano da 7b per 7c metà dell’anno. In questo caso il Class_Membership tabella potrebbe avere un start_date campo e, eventualmente, di un end_date campo.

    Niente di che, però, crea direttamente il id_class campo (1-20 per una classe di 20 studenti). Personalmente, io non sono tale campo, il id campo da Class_Membership tabella può servire la maggior parte delle funzionalità, e probabilmente funzionalità aggiuntive. Dove è necessario, tuttavia, si potrebbe semplicemente aggiungere il Class_Membership tabella…

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

    Quindi si potrebbe anche avere un unico vincolo (academic_year, class_id, class_member_id).

    C’è un sacco di flessibilità, qui, a seconda della reale-mondo-modello e le vostre esigenze particolari. Ma speriamo che questo esempio è un buon inizio per voi; Dimensione tabelle elenco delle Entità, e una tabella dei Fatti (o tabelle) relative a questi soggetti insieme e/o descrivere meglio l’Entità.

    Come si domanda lo schema così com’è, vorrei aggiungere il mio pensiero qui. @Bosak, la mia comprensione il “sottofondo” è solo una lettera di distinguere diverse classi dello stesso grado. Così, mentre i grado e sottogrado identificare una classe, un sottofondo di per sé non è un’entità. Si raramente essere interessato a “tutte le classi con sottogrado b”, e ancor meno interessato a memorizzare gli attributi comuni per tutte le classi b, giusto? In questo caso, mi piacerebbe cadere il Sottofondo tabella.

    InformationsquelleAutor MatBailie

Lascia un commento