2013-02-14 3 views
0

J'ai une base de données nommée « assessment.db »Comment joindre les tables de SQLite en utilisant la clé primaire dans plusieurs-à-plusieurs

Dans ce que j'ai une table nommée « utilisateurs » avec cette configuration (prenom VARCHAR clé primaire)

et un nommé « Livres avec cette configuration (pairBookName VARCHAR UNIQUE, activité1 VARCHAR, activity2 VARCHAR, activité3 VARCHAR)

l'utilisateur saisit son nom, qui est stocké dans la 'table' utilisateurs, Je travaille parfaitement pour le moment. Maintenant, ce que je veux faire est de mettre en place une liste de contrôle pour suivre les progrès d'un utilisateur à travers les activités. Par exemple: 'Ryan' entre son nom, puis entre dans Book1 et termine Activity1 et Activity2.

Je suis en train d'obtenir ma tête autour de la façon de faire correspondre la table des utilisateurs et des feuilles, il ne semble pas comme simple JOIGNEZ

Je l'ai regardé à travers des questions précédentes et ne peut pas sembler trouver quelqu'un avec la même configuration de base de données/problème.

Merci à tous.

Répondre

4

Tout d'abord, je vous recommande d'avoir un livre d'introduction (ou site Web) sur la conception de la base de données. Votre schéma a un certain nombre de problèmes:

  1. Comment traitez-vous avec 2 utilisateurs differant nommé « Jim »
  2. Comment traitez-vous avec 2 livres differant nommés «Introduction à la conception de base de données?
  3. Est-ce que chaque livre a exactement 3 activités? Autrement dit, aucun n'a 2 et aucun n'en a 4?

Avec votre question spécifique, il s'agit d'une simple relation plusieurs-à-plusieurs; un utilisateur peut avoir beaucoup de livres et un livre peut avoir plusieurs utilisateurs. Ceci est traité en utilisant une 3ème table avec le PK des utilisateurs et le PK des livres comme son PK composite (aucun de ces derniers ne devrait être un varchar!).

Pour votre problème, cela peut être la table dans laquelle vous stockez les activités.

1

Il semble que vous recherchiez une table de jointure intermédiaire qui permet l'existence d'une relation plusieurs-à-plusieurs. Je pourrais suggérer quelque chose comme ceci pour un schéma de table:

CREATE TABLE User 
(
    UniqueID uniqueidentifier NOT NULL Primary Key default newid(), 
    FirstName nvarchar(100) NOT NULL, 
    etc.. 
) 

CREATE TABLE Book 
(
    UniqueID uniqueidentifier NOT NULL Primary Key default newid(), 
    Title nvarchar(100) NOT NULL, 
    etc.. 
) 

CREATE TABLE Activity 
(
    UniqueID uniqueidentifier NOT NULL Primary Key default newid(), 
    Description nvarchar(100) NOT NULL, 
    etc... 
) 

CREATE TABLE UserActivity 
(
    UserID uniqueidentifier NOT NULL, 
    BookID uniqueidentifier NOT NULL, 
    ActivityID uniqueidentifier NOT NULL, 
    CONSTRAINT PK_UserActivity PRIMARY KEY CLUSTERED 
    (
     UserID ASC, 
     BookID ASC, 
     ActivityID ASC 
    ) 
) 

De cette façon, beaucoup d'utilisateurs peuvent avoir beaucoup d'activités pour beaucoup de livres. Les meilleures pratiques en matière de conception de base de données suggèrent que vous n'utilisez pas FirstName comme clé primaire, car de nombreuses personnes peuvent avoir le même prénom. Vous voulez quelque chose d'un peu plus unique comme un champ int ou un identifiant unique.

Livre et activité sont similaires - ils stockent les différents livres ("Livre 1", "Livre 2") et les différents types d'activités qui peuvent être effectuées ("Complète Activité 1", "Complète Activité 2").

Chaque fois qu'un utilisateur termine une activité pour un livre, un enregistrement est inséré dans UserActivity qui décrit l'utilisateur, le livre et l'activité qui a été effectuée.Bien que cela puisse sembler exagéré à ce stade, vous ne le regretterez pas si vous décidez d'ajouter des fonctionnalités à un moment donné - comme ajouter un nouveau type d'activité ou un nouveau livre qui ne fonctionne pas. t ont tous les mêmes types d'activités que d'autres livres. Une base de données bien conçue devrait faciliter l'ajout de nouveaux éléments à votre logiciel. Codage heureux.

0

Merci pour l'entrée, j'allais à ce sujet tout à fait le mauvais sens il semble.

Je fini par utiliser le code pour créer des tableaux à la volée lorsqu'un nom d'utilisateur est entré:

var form = document.getElementById("userName"); 
    localStorage.name = form.elements.firstName.value; 
    var user = localStorage.name; 

    db.execute("CREATE TABLE IF NOT EXISTS "+user+"(bookName TEXT, activity1 TEXT, activity2 TEXT, activity3 TEXT, activity4 TEXT, activity5 TEXT, activity6 TEXT, activity7 TEXT, activity8 TEXT, activity9 TEXT)"); 

De cette façon, je peux garder l'utilisateur localStorage.name et l'appeler plus tard la mise à jour des progrès.

Questions connexes