2010-05-12 7 views
0

Je ne sais même pas si c'est le bon terme.Codeigniter: comment restructurer db schema?

Puis-je savoir que je suis un novice majeur!

J'ai trois tables: utilisateurs, profils et sondage. Chacun a user_id comme premier champ, (auto-incrément pour les utilisateurs), et ils sont tous liés par une contrainte de clé étrangère, CASCADE sur DELETE.

Actuellement, pour chaque utilisateur, disons user_id 1, ils ont une entrée db correspondante dans les autres tables. Pour les profils, il répertorie toutes leurs informations et la table d'enquête contient toutes les informations de l'enquête.

Maintenant, je dois changer les choses ... darn scope creep. Les utilisateurs doivent avoir la possibilité d'avoir plusieurs résultats d'enquête. J'imagine que ce serait similaire à une table de commentaires pour un blog ...

Mon application entière tourne autour de l'idée qu'un seul utilisateur est lié à un profil contraignant et à un sondage.

Comment dois-je structurer ma base de données?

Comment devrais-je concevoir la base de données de mon application pour qu'un utilisateur puisse avoir plusieurs tests/profils pour le test?

Veuillez nous aider! Tous les conseils, informations et connaissances personnelles sont appréciés!

Actuellement, la seule façon dont je sais comment accompagner mon client est de créer un pseudo-utilisateur pour chaque test (donc inutile) et les lister dans une table de vue (appelée "vos tests") - ce sont obtenu à partir de la base de données en disant: où user_id = ID_gestionnaire

Répondre

2

À l'heure actuelle, l'enquête a une clé étrangère à l'utilisateur, identifiant l'utilisateur qui a répondu à l'enquête. C'est bon, et ne change pas.

Mais ajoutez une clé primaire auto-incrémentée à l'enquête (et au profil aussi). Maintenant, un utilisateur peut avoir plusieurs enquêtes. Chaque enquête individuelle a sa clé, et son preneur est identifié par la clé étrangère de l'utilisateur.

Pour trouver toutes les enquêtes pour tous les utilisateurs:

Pour trouver toutes les enquêtes pour un utilisateur:

select a.*, b,* 
from user a 
join survey b on (b.user_id = a.user_id) 
where a.user_id = some_user_id; 

obtenir juste les données de l'enquête, il suffit de sélectionner b.* seulement. Par exemple:

select b.* 
from survey b on 
where a.user_id = (select user_id from user a where a.name = 'Bob'); 

Encore une fois, tout ce que vous devez faire est d'ajouter une clé primaire (qui devrait être un autoincrement) à l'enquête.

+0

Je pense que je comprends ... J'aurai d'autres questions demain! –

+0

Cela fonctionne ... Que faire si je veux supprimer un sondage? La façon dont les choses fonctionnent (peut-être que je n'ai pas communiqué correctement), je supprime toutes les enquêtes, car elles sont liées à l'id_utilisateur. –

+0

Pour supprimer (ou sélectionner ou mettre à jour) toutes les enquêtes pour un utilisateur, utilisez l'id_utilisateur: par exemple, supprimer de l'enquête où ID_utilisateur = x; ou, supprimez l'utilisateur et laissez la cascade supprimer sur le fk les supprimer pour vous. Si vous souhaitez supprimer (ou sélectionner ou mettre à jour) un seul sondage, utilisez l'identifiant de ce sondage. – tpdi