2016-05-20 12 views
1

Ich erstelle eine Datenbank mit einer users Tabelle, aber es gibt drei Arten von Benutzern (Admin, Lehrer und Schüler) und einige Typen hat seine eigenen Eigenschaften. Hier sind meine Lösungen:Probleme beim Entwerfen der SQL-Benutzer-Tabelle

1 - Drei verschiedene Tabellen:

table_admin  
    id 
    name 
    email 
    password 

table_teachers 
    id 
    name 
    email 
    password 
    teacher_only_a 
    teacher_only_b 

table_students 
    id 
    name 
    email 
    password 
    student_only_a 
    student_only_b 

2 - Eine Tabelle, so dass NULL-Werte:

table_users 
    id 
    name 
    email 
    password 
    teacher_only_a (null on admin and student) 
    teacher_only_b (null on admin and student) 
    student_only_a (null on admin and teacher) 
    student_only_b (null on admin and teacher) 

3 - Verwandte Tabellen:

table_users 
    id 
    name 
    email 
    password 
    teacher_id (null on admin and student) 
    student_id (null on admin and teacher) 

table_teachers 
    id 
    teacher_only_a 
    teacher_only_b 

table_students 
    id 
    student_only_a 
    student_only_b 

Welches sind die besten Designoptionen? Gibt es eine andere Lösung?

+0

Was ist die Beziehung von 'admin' zu allen anderen? –

+0

'admin' hat keine zusätzliche Eigenschaft – Leonardo

Antwort

0

Warum nicht

table_users 
    id 
    name 
    email 
    password 
    is_admin 

table_teachers 
    user_id 
    teacher_only_a 
    teacher_only_b 

table_students 
    user_id 
    student_only_a 
    student_only_b 

würde das abstrahieren die Benutzerinformationen, so gibt es keine Redundanz ist.

+0

Gut ein JJ32! Ich würde ein 'type'-Feld hinzufügen (genau wie' is_admin'), um korrekt Join-Tabellen zu erstellen. Ich benutzte meine dritte Lösung, aber ich konnte keinen Fremdschlüssel für dieses Muster verwenden. Danke vielmals! – Leonardo

0

Ich würde für zwei Tabellen, eine user genannt werden, die Benutzernamen, Rolle und andere Metadaten speichern wird, und eine zweite Tabelle namens user_relation, die Beziehungen zwischen Benutzern speichern wird.

Benutzer

id 
name 
email 
password 
role (admin, teacher, or student) 

user_relation

id1 
id2 

ich zwei Annahmen hier in meinem Design mache. Die erste besteht darin, dass die Rolle eines Benutzers nur admin, teacher oder student ist. Wenn ein Benutzer mehr als eine Rolle haben kann, müssen Sie eine neue Tabelle user_role erstellen, die diese Informationen speichert. Die zweite Annahme ist, dass klar ist, was die Art einer Beziehung nur durch die Arten von Benutzern ist. Wenn beispielsweise ein Datensatz von user_relation einen Schüler und einen Lehrer enthält, wird implizit angenommen, dass der Schüler der Klasse dieses Lehrers angehört. Wenn ein Lehrer und ein Administrator einen Eintrag haben, wird angenommen, dass dieser den ersten verwaltet. Sie können jedoch leicht eine Spalte für den Relationstyp hinzufügen, wenn Sie sie flexibler gestalten und beispielsweise einem Administrator erlauben möchten, auch Student zu sein.

0

Da Benutzer dynamisch variierende Attribute haben, ist es besser, ein Mapping-Attribut zu erstellen und sie nur getrennt abzurufen, wobei berücksichtigt wird, dass sie denselben Datentyp haben. Was ist der Wert für teacher_only_a und student_only_a, welche Art von Daten werden hier gespeichert?

table_user 
    id 
    name 
    email 
    password 
    type // T:Teacher S:Student 

table_user_attributes 
    user_id 
    attribute_name 
    attribute_value 
+0

Es könnte String, Nummer, Datum sein ... und manchmal NOT NULL – Leonardo

Verwandte Themen