我有一个名为'assessment.db'的数据库
在此我有一个名为'Users'的表具有此设置 (firstName VARCHAR PRIMARY KEY)
和一个名为'具有此设置的图书 (pairBookName VARCHAR UNIQUE,activity1 VARCHAR,activity2 VARCHAR,activity3 VARCHAR)
用户输入他们的名字,该名称存储在“用户”表中,我现在已经完美地工作了。现在我要做的是设置一个清单来跟踪用户在活动中的进度。
所以例如:'Ryan'输入他的名字,然后进入Book1并完成Activity1和Activity2。
我正试图弄清楚如何匹配Users表和Books表,它似乎不是一个简单的JOIN
我查看过以前的问题,似乎无法找到任何具有相同数据库设置/问题的人。
谢谢大家。
答案 0 :(得分: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中,稍后再调用它来更新进度。