0

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

在这个设置中,我有一个名为“用户”的表(firstName VARCHAR PRIMARY KEY)

和一本名为“具有此设置的书籍(pairBookName VARCHAR UNIQUE,activity1 VARCHAR,activity2 VARCHAR,activity3 VARCHAR)

用户输入他们的姓名,该姓名存储在“用户”表中,我现在可以正常工作。现在我想做的是设置一个清单来跟踪用户在活动中的进度。

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

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

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

谢谢大家。

4

3 回答 3

4

首先,我建议您获取有关数据库设计的介绍性书籍(或网站)。您的架构有许多问题:

  1. 您如何处理名为“Jim”的 2 个不同用户
  2. 您如何处理两本名为“数据库设计简介”的不同书籍?
  3. 每本书是否正好有 3 个活动?也就是说,没有人有 2,也没有人有 4?

对于您的具体问题,这是一个简单的多对多关系;一个用户可能有很多书,而一本书可能有很多用户。这是使用第三张表来处理的,其中用户的 PK 和书籍的 PK 作为其复合 PK(这些都应该是 varchar!)。

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

于 2013-02-14T04:34:34.367 回答
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。

Book 和 Activity 是相似的——它们存储不同的书籍(“Book 1”、“Book 2”)和可以执行的不同类型的活动(“Completes Activity 1”、“Completes Activity 2”)。

每次用户完成一本书的活动时,都会将一条记录插入到 UserActivity 中,该记录描述了用户、书籍和执行的活动。

尽管这在这一点上看起来确实有点过头了,但如果您决定在以后的某个时候添加功能,您不会后悔的——比如添加一种新类型的活动,或者一本没有所有功能的新书。与其他书籍相同类型的活动。一个设计良好的数据库应该可以很容易地为您的软件添加新内容。快乐编码。

于 2013-02-14T04:47:05.667 回答
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 中并稍后调用它以更新进度。

于 2013-02-15T05:31:42.230 回答