如何在多对多关系中使用主键连接SQLITE表

时间:2013-02-14 03:28:28

标签: sql database sqlite save

我有一个名为'assessment.db'的数据库

在此我有一个名为'Users'的表具有此设置 (firstName VARCHAR PRIMARY KEY)

和一个名为'具有此设置的图书 (pairBookName VARCHAR UNIQUE,activity1 VARCHAR,activity2 VARCHAR,activity3 VARCHAR)

用户输入他们的名字,该名称存储在“用户”表中,我现在已经完美地工作了。现在我要做的是设置一个清单来跟踪用户在活动中的进度。

所以例如:'Ryan'输入他的名字,然后进入Book1并完成Activity1和Activity2。

我正试图弄清楚如何匹配Users表和Books表,它似乎不是一个简单的JOIN

我查看过以前的问题,似乎无法找到任何具有相同数据库设置/问题的人。

谢谢大家。

3 个答案:

答案 0 :(得分:4)

首先,我建议您获得有关数据库设计的入门书籍(或网站)。您的架构存在许多问题:

  1. 您如何处理名为'Jim'的2名不同用户
  2. 您如何处理名为“数据库设计简介”的2本不同书籍?
  3. 每本书都有3项活动吗?也就是说,没有2个没有4?
  4. 根据您的具体问题,这是一个简单的多对多关系;用户可能有很多书,而书可能有很多用户。这是使用带有用户PK和书籍PK的第3个表来处理它的复合PK(其中这些应该是varchar!)。

    对于您的问题,这可能是您存储活动的表格。

答案 1 :(得分:1)

听起来你正在寻找一个允许存在多对多关系的中间连接表。对于表模式,我可能会建议这样的事情:

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
    )
)

这样,许多用户可以为许多书籍开展许多活动。数据库设计的最佳实践建议您不要使用FirstName作为主键,因为许多人可能具有相同的名字。你会想要一些像int字段或uniqueidentifier更独特的东西。

书籍和活动类似 - 它们存储不同的书籍(“书籍1”,“书籍2”)以及可以执行的不同类型的活动(“完成活动1”,“完成活动2”)。 / p>

每次用户完成图书的活动时,都会在UserActivity中插入一条记录,该记录描述用户,图书和已执行的活动。

虽然这在某些方面看起来似乎有些过分,但如果您决定在未来的某个时刻添加功能,您将不会后悔 - 例如添加新类型的活动,或者不添加新书拥有与其他书籍相同类型的活动。精心设计的数据库应该可以轻松地向软件中添加新内容。快乐的编码。

答案 2 :(得分:0)

感谢您的投入,我似乎错误地看待了这一点。

当输入用户名时,我最终使用代码动态创建表格:

   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)");

这样我可以将用户保留在localStorage.name中,稍后再调用它来更新进度。