2013-02-23 31 views
1

我試圖創建一個清單系統,例如。要收集的物品列表。用戶將能夠將列表添加到他們的個人資料,然後當他們收集項目,然後可以檢查列表中的項目框單擊提交和檢查項目現在將被標記爲收集。我有它編碼和工作正常,但它使數據庫的查詢工作量瘋狂。冗餘數據是否可以保存,如果它不需要查詢?

我有5個表格。一個用戶表(用於註冊用戶的用戶名,id..etc),一個列表表(包含列表名,說明,id),一個列表項表(包含單個項目id,title和listID它屬於))。用戶列表表(用於列表用戶已添加到他們的個人檔案userID和列表ID)和收集項目表(它具有一個人已檢查收集的列表項,列表項ID,用戶ID)

問題是什麼時候我查看mylists.php頁面,它將查詢userslist表並返回用戶添加的列表的所有ID。那麼一旦我有了列表的ID,它就會查詢列表以找出列表的名稱(這可能意味着如果我添加了10個不同的列表,則必須對列表進行10次查詢)。如果我添加一個listname列到用戶列表中,我只需要爲該頁面進行1次查詢,那就是userslists表格,我可以用那個1個查詢構建頁面。

+0

如果允許用戶重命名列表,可以將其存儲在'userlist'表中。否則,過早優化是很多邪惡的根源,儘管它可能很有趣。 – 2013-02-23 16:54:24

+0

這個問題並不真正相關,但'collectitems'表可以選擇'(ListID,ItemsID,UserID)'作爲列。這樣你可以執行參照完整性。您現在擁有表格的方式可能會以用戶收集屬於不在該用戶列表中的列表的項目結束。 – 2013-02-23 16:58:32

回答

1

首先,我不擔心主鍵上的查詢。所有的表都有一個由其他表引用的主鍵。這些將使用連接。

其次,您不必單獨獲取列表名稱。使用以下查詢:

select l.listName 
from UserLists ul join 
    Lists l 
    on ul.listId = l.listId 
where userId = $userid 

這將返回單個查詢中的所有名稱。

+1

除了乞求SQL注入攻擊的部分之外,這是堅實的。 – 2013-02-23 16:50:29

+0

@MattBall。 。 。爲這樣的應用程序使用參數化查詢/準備語句是一個很好的建議。這是對這個話題的一個很好的解釋。 。 。 http://stackoverflow.com/questions/60174/how-to-prevent-sql-injection-in-php。 – 2013-02-23 16:56:14

+0

非常感謝。也感謝上面的鏈接,我還沒有使用準備好的陳述,我會去做,現在 – 2013-02-23 17:05:39

1

這聽起來像你應該保持你的數據規範化(即避免冗餘數據),而是通過使用JOIN收集所有你想要的數據在一個單一的查詢。

相關問題