2013-02-14 69 views
0

我有一個數據庫名爲「assessment.db」如何在一個多一對多的關係用主鍵加入SQLITE表

在此我有一臺名爲「用戶」與此設置 (名字VARCHAR PRIMARY KEY)

和一個名爲「在此設置 圖書(pairBookName VARCHAR UNIQUE,活性1 VARCHAR,活性2 VARCHAR,activity3 VARCHAR)

用戶輸入他們的名字,其被存儲在所述 '用戶' 表,目前我的工作很完美。現在我想要做的就是設置一個清單來跟蹤用戶通過活動的進度。

例如:'Ryan'輸入他的名字,然後進入Book1並完成Activity1和Activity2。

我試圖讓我圍繞如何匹配用戶表和書籍表頭,它似乎並不像一個簡單的JOIN

我已經通過前面的問題看,不能似乎找到任何具有相同數據庫設置/問題的人。

謝謝大家。

回答

4

首先,我會建議您獲取關於數據庫設計的介紹性書籍(或網站)。你的架構有一些問題:

  1. 你如何處理與2個名爲「吉姆」
  2. 你如何處理與2個名爲「介紹數據庫設計」歧書歧用戶?
  3. 每本書都有3個活動嗎?也就是說,沒有2個沒有4個?

有了您的具體問題,這是一個直截了當的多對多關係;一個用戶可能有很多書,一本書可能有很多用戶。這是使用第三個表與PK的用戶和PK的書PK作爲其複合PK(不管這些應該是一個varchar!)。

對於您的問題,這可能是您存儲活動的表格。

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

每次用戶完成書籍的活動時,記錄都會插入到描述用戶,書籍和執行的活動的UserActivity中。

雖然在這一點上看起來似乎有些過分,但如果您決定在某個時間點添加功能,您不會後悔 - 比如添加新類型的活動,或者新書不會「不像其他書籍那樣具有相同類型的活動。一個設計良好的數據庫應該能夠很容易地爲你的軟件添加新的東西。快樂的編碼。

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用戶以後調用它來更新進度。