0

「assessment.db」という名前のデータベースがあります

これには、この設定で「ユーザー」という名前のテーブルが1つあります(firstName VARCHAR PRIMARY KEY)

および「この設定の書籍 (pairBookName VARCHAR UNIQUE、activity1 VARCHAR、activity2 VARCHAR、activity3 VARCHAR)」という名前の 1 つ

ユーザーは、「ユーザー」テーブルに保存されている名前を入力します。現時点では完全に機能しています。ここでやりたいことは、チェックリストを設定して、アクティビティを通じてユーザーの進行状況を追跡することです。

例: 「Ryan」は自分の名前を入力し、次に Book1 に入り、Activity1 と Activity2 を完了します。

Users テーブルと Books テーブルを一致させる方法を理解しようとしていますが、単純な JOIN とは思えません。

以前の質問に目を通しましたが、同じデータベースのセットアップ/問題を抱えている人を見つけることができないようです.

皆さんありがとう。

4

3 に答える 3

4

まず、データベース設計の入門書(またはWebサイト)を入手することをお勧めします。スキーマにはいくつかの問題があります。

  1. 「ジム」という名前の2人の異なるユーザーにどのように対処しますか
  2. 「データベース設計入門」という名前の2冊の異なる本をどのように扱いますか?
  3. すべての本には正確に3つのアクティビティがありますか?つまり、2つはなく、4つはありませんか?

あなたの特定の質問では、これは単純な多対多の関係です。ユーザーは多くの本を持っているかもしれませんし、本は多くのユーザーを持っているかもしれません。これは、ユーザーのPKと本のPKを複合PKとして持つ3番目のテーブルを使用して処理されます(これらのいずれも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 に答える