一些背景故事:(跳到下面以粗体直接进入问题)
过去几个月我一直在用 Python 编程,但我仍然是一个初学者。我了解基础知识(循环、if 语句、函数、类等),但缺乏更深入的知识(大 o 表示法、索引如何工作等)。
我有一个 sqlite 数据库,我一直在其中存储项目的数据。在一个称为论文的表中,每一行包含我写的一篇论文,以及它所针对的类(class)、类别(技术、小说、白皮书等)以及与其相关的评级(1-5)。
所以我的 table 看起来像这样:
PID| Paper Name | Class | Category | Rating
1 | A Foo Bar Story: The study of X | Intro to Foobar | Term Paper, Science | 4
...(等)
我还创建了另一个名为 Classes 的表,它看起来与此类似
Class Name | ClassURL | Teacher Email | Ratings | Vote count
Intro to Foobar | www.foobar.com/itf | xyz@zyx.com | 240 | 100
...(等)
其中类(class)评分是评分除以投票数。
我的问题是这样的:
现在,每当我对一篇论文进行评分时,我都会更新评分字段和投票计数字段,方法是将论文的评分添加到“评分”中,并使用 UPDATE classes SET ratings=( ?), vote_count=(?) where classname=(?)
(带有变量)。
当时我认为这比对论文表中的所有论文进行SELECT
复杂性要低(我们假设可以是无限的)WHERE class=“Whatever”
,然后将它们全部相加,然后除以计数。然而,我想得越多,我就越不确定。有人可以告诉我哪一个在大型论文数据库中更快,为什么?
最佳答案
一般来说,您应该避免存储冗余数据。迟早有人或某件事会搞砸,让你的数据不同步,这会给你带来很多痛苦。
您可以使用 SUM 和 COUNT 轻松计算类(class)评分,例如(未经测试!)
SELECT ClassName, SUM(Rating)/COUNT(*) FROM Papers GROUP BY ClassName
也就是说,您不必在客户端进行计算,您的数据库可以轻松完成。
您应该删除冗余的 Classes.Ratings 和 Classes.Votecount 列,除非您有真正充分的理由保留它们。我认为如果保留冗余列,尤其是涉及类评级的 SELECT 可能会更快一些。如果您想获得类(class)评分以及类(class)的其他属性(例如教师电子邮件)。但这完全无关紧要,除非你有一个非常大的数据库,并且由一个流量非常高的网站查询,对此我表示怀疑。
如果您关心速度,保留冗余列绝对不是要采取的第一步。我不确定 sqlite 如何处理索引 - 在 MySQL 中,您需要确保表 Papers 具有 ClassName 列的索引,以加快上面的查询速度。如果您正在运行复杂的查询(顺便说一句,上面的查询不是),请首先开始优化您的查询。
关于sql - SELECT 获取数据还是将其存储在字段中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4666004/