Php 如果冗余数据节省了进行查询的时间,是否可以?

Php 如果冗余数据节省了进行查询的时间,是否可以?,php,sql,database,database-design,Php,Sql,Database,Database Design,我正在尝试创建一个清单系统,例如要收集的项目列表。用户将能够将列表添加到他们的配置文件中,然后当他们收集项目时,可以选中列表中某个项目的复选框,单击提交,选中的项目现在将标记为已收集。我有它的编码和工作良好,但它使大量的查询数据库的工作 我有五张桌子。用户表(用于注册用户用户名、id等)、列表表(包含列表名称、描述、id)、列表项表(包含单个项.id、标题和列表id(用于引用它所属的列表))。userslist表(用于用户已添加到其profile.userID和listID中的列表)和colle

我正在尝试创建一个清单系统,例如要收集的项目列表。用户将能够将列表添加到他们的配置文件中,然后当他们收集项目时,可以选中列表中某个项目的复选框,单击提交,选中的项目现在将标记为已收集。我有它的编码和工作良好,但它使大量的查询数据库的工作

我有五张桌子。用户表(用于注册用户用户名、id等)、列表表(包含列表名称、描述、id)、列表项表(包含单个项.id、标题和列表id(用于引用它所属的列表))。userslist表(用于用户已添加到其profile.userID和listID中的列表)和collecteditems表(其中包含人员已在“已收集”框中选中的列表项。listItemsID,userID)


问题是,当我查看mylists.php页面时,它将查询userslist表,并返回用户添加的列表的所有ID。一旦我有了列表的ID,它就会查询列表表,找出列表的名称(如果我添加了10个不同的列表,这可能意味着必须对列表表进行10次查询)。如果我在userslist表中添加了一个listname列,我只需要对页面进行一次查询,也就是对userslists表进行一次查询,我就可以用这一次查询构造页面

听起来您应该保持数据的规范化(即避免冗余数据),而不是在单个查询中收集所需的所有数据。首先,我不必担心主键上的查询。所有表都有一个被其他表引用的主键。这些将使用连接

其次,您不必单独获取列表名称。使用以下查询:

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

这将在一个查询中返回所有名称。

除了请求SQL注入攻击的部分之外,这是可靠的。@MattBall。对于这样的应用程序,最好使用参数化查询/准备好的语句。这是对那个话题的一个很好的解释。谢谢。同样感谢上面的链接,我还没有使用准备好的语句,我现在就去做。如果允许用户重命名列表,您可以将其存储在
userlist
表中。否则,过早的优化是许多问题的根源,尽管这可能很有趣。这与问题并不相关,但
collecteditems
表也可以将
(ListID、ItemsID、UserID)
列为列。这样您就可以强制执行引用完整性。现在使用该表的方式,您可能会以用户收集了不属于该用户列表的列表中的项目作为结束。