sql - SELECT 获取数据还是将其存储在字段中?

标签 sql mysql sqlite select complexity-theory

一些背景故事:(跳到下面以粗体直接进入问题)

过去几个月我一直在用 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/

相关文章:

sql - 使用更新语句增加日期时间字段

php - 在外部存储过程中使用 MySQL 变量

php - 错误: Undefined Index php

mysql - 如何在给定附加 ID 的情况下按最近日期排序

sql - 如何在同一查询中添加两个选择命令的结果

sqlite - WITH UPDATE语句上的“无此列”

php 代码突然停止工作。奇怪的行为?

sql - 在多列主键中选择最后一行版本的更好方法

不带引号的 MySQL IN 子句

android - SQLiteDatabase 更新不起作用?