2012-04-11 2 views
0

Je cherche la meilleure approche pour ce problème de conception de base de données. Je pense que j'ai trouvé quelque chose qui fonctionne bien, mais je ne sais pas si c'est la meilleure approche. J'utilise CakePHP si cela signifie quelque chose pour vous.Comment structurer les types de personnes dans une base de données

Ma base de données est faite pour des cours de musique. J'ai tous que ce soit les parents, les élèves, les enseignants, les administrateurs ou toute autre personne dans une table des gens appelé décrites ci-dessous:

People 
id first_name last_name email created modified 

Maintenant, la question que je commence à avoir est de savoir comment identifier une personne en tant que professeur, parent élève etc. Il est logique pour moi d'avoir un tableau séparé pour chaque groupe. Par exemple

Teachers 
id person_id 

Students 
id person_id 

Payers 
id person_id 

De cette façon théoriquement un enseignant peut aussi être un étudiant. Un «payeur», la personne qui paie pour les leçons, pourrait aussi être un étudiant et la liste continue.

Maintenant, j'ai aussi besoin de connaître la relation entre une personne et un étudiant. Je voudrais donc avoir une table séparée comme ceci:

Relationships: 
id person_id student_id type 

« type » pourrait être mère, père, tuteur légal, preneur de soin, tante, grand-mère, etc. Cette conception me semble logique, mais en même temps semble être un peu de travail et de tableaux pour décrire quelque chose qui semble être plus facile à décrire. Y a-t-il une meilleure manière de faire cela? Je ne cesse de deviner moi-même et pense avoir une toute nouvelle table juste pour étiqueter une personne en tant qu'étudiant ou enseignant ou ce qui ne semble pas exagéré en quelque sorte.

+0

Avez-vous besoin de différents types de relations pour les différents types de personnes impliquées dans les différents types de personnes, ou seulement un type générique suffit? Par exemple, y a-t-il quelque chose de spécial au sujet de la relation entre l'enseignant et l'élève par rapport à la relation entre le dire, le parent et l'élève? –

+0

J'ai besoin de relations différentes. C'est juste pour savoir qui sont les gens. J'ai besoin de savoir quand je communique avec quelqu'un qu'ils sont la maman ou la grand-mère ou seulement la personne qui va payer pour les leçons. Je n'aurais pas besoin d'une table supplémentaire pour expliquer les relations pour les parents ou les grands-parents, etc. J'ai seulement besoin de savoir qui sont le payeur et l'étudiant pour les calculs réels.Toutes les autres relations seraient définies dans le tableau "relations" qui n'aurait pas besoin de calculs et serait juste pour contacter les gens. –

Répondre

1

Vous avez décrit un scénario de sous-typage classique, où PERSON est votre supertype et vous avez défini des sous-types, y compris: STUDENT, TEACHER, PARENT (vraiment gardien), et probablement d'autres types aussi bien, comme les employés, etc.

Généralement lorsque vous utilisez ce type de modèle de sous-typage, c'est parce que les différents sous-types ont leurs propres prédicats , c'est-à-dire des attributs ou des relations. Pour modéliser vos relations, vous devez décider ce qui est important du point de vue des règles métier et ce qui vaut la peine d'être appliqué pour imposer ces règles métier dans votre schéma. Si vous voulez ou devez être difficile, vous pouvez décider d'avoir une table GUARDIAN_RELATIONSHIP qui est une intersection entre vos tables PARENT et STUDENT. Cela aurait FK à chacun des sous-types de personnes en question ainsi que votre type de relation drapeau/code/description. Vous pouvez également avoir une seule table PERSONAL_RELATIONSHIP qui est une intersection entre deux enregistrements PERSON. Vous pouvez également mettre un code de type de relation ici aussi. Cette approche est beaucoup plus lâche mais peut-être plus facile à maintenir. En fin de compte, cela dépend du nombre de types de relations que vous devez suivre et de leur position centrale par rapport à vos règles métier.

+0

Comment faire l'intersection entre la table personal_relationship et les enregistrements de deux personnes? Je ne peux pas avoir person_id deux fois dans la table de relations personnelles ... Cela semble être la meilleure façon, mais je suis confus sur la façon de s'y prendre. –

+0

@Brian - Vous pouvez facilement avoir 'person_id' deux fois, il suffit de donner un nom différent à chaque colonne, comme' first_person_id', 'second_person_id'. Utilisez votre contrainte FK pour lier chaque FK à 'PERSON.person_id'. Cela ne devrait pas poser de problème à moins qu'il y ait une contrainte dans CakePHP qui nécessite ce que l'on appelle des "jointures naturelles" (qui se joignent par des noms de colonnes égaux). –

+0

@Brian Vous pourriez trouver intéressant d'examiner [les raisons de la sous-dactylographie] (https://support.ca.com/cadocs/0/CA%20ERwin%20Data%20Modeler%20r8-ENU/Bookshelf_Files/HTML/ Methods/index.htm? Toc.htm? 254775.html). Vous devrez décider si ces raisons s'appliquent dans votre cas. –

Questions connexes