我设计了数据库表,其中多个表存储一个值,所有这些都可以通过查询一个表来实现。
我的问题是,最好不要存储重复数据并始终执行查询,或者多次存储较小的值以减少所需的查询数量,这是一种更好的做法吗?
对于上下文,我正在构建一个Python应用程序,该应用程序使用SQLAlchemy和SQLite来测试韩语问题。
我有User,Quiz和Question类。
有问题的值是num_correct,关于测验问题是num_wrong。
基本上,我有一个问题表,其中存储了所有与quiz_id相关的测验问题。每个问题都有一个“正确”列,该列存储一个布尔值,告诉该问题是否已正确回答。
在“测验”表中,我有num_correct / num_wrong列,涉及针对该测验的答案。
在“用户”表中,我也有num_correct / num_wrong列,这些列始终表示正确和错误的答案。
我意识到,要获取“测验”中的值,我可以查询“问题”表,并获取“用户”中的值,我也可以这样做。
在这种情况下(通常),考虑最佳实践的首选策略是什么?
我已经尝试了很多次谷歌搜索,但是措辞上的问题有点棘手。
答案 0 :(得分:3)
在关系数据库中,重复数据的问题是一个复杂的问题。如果您的应用程序要进行数据修改,则重复的数据会引起同步问题-数据需要在多个位置进行更新。
这很糟糕,原因有多种:
数据库 do 通过ACID属性,事务和触发器支持此功能。但是,它们增加了开销。通常,重复是出于必要(即性能)而不是预先添加的。因此,强烈希望使用归一化的数据模型,该模型中的信息仅在频繁发生更新时才存储一次。
另一方面,某些数据库主要用于查询目的。这些数据库通常会被非规范化-的确如此。例如,客户表可能包含许多不同维度的摘要,并从数十个基础表中收集信息。
这不仅简化了查询,而且对业务逻辑进行了编码。使用数据的一个主要问题是,不同的人对事物的定义稍有不同-一年的客户是365天前开始的吗?去年的同一天有人开始吗?有人待了12个月?标准化的分析表提供了答案。
您的案件似乎更多地属于第一种情况。您正在进行更新,并正在考虑预先存储摘要。我不鼓励您这样做。只需编写您需要汇总数据的查询即可。索引和分区很可能会提供您所需的所有性能。
如果您预先知道您将有数百万个用户参加数百个测验并提出许多问题,那么您可能需要先考虑性能优化。但是,对于成千上万的用户,他们对几十个问题进行了少量测验,请从简单的数据模型入手,并在证明其有效后将其变得更复杂。 。
答案 1 :(得分:1)
我的问题是,最好不要存储重复数据并始终进行查询,或者多次存储较小的值以减少所需的查询次数,这是一种更好的做法吗?
我不知道这如何减少查询数量。
这可能会影响查询的复杂度,即您需要将几个表连接在一起,而不是对一个表进行简单查询,但是这些操作非常快。我不会担心速度。
如果您重复数据,则将最终不同步,那么您将遇到大麻烦。
简而言之,请勿重复。
此外,这个问题实际上与Python没有任何关系。