ahe*_*eld 3 sql database sqlalchemy
我设计了我的数据库表,其中多个表存储一个值,所有这些都可以通过查询一个表来实现。
我的问题是,从不存储重复数据并始终进行查询,或者多次存储小值以减少所需查询的数量,是否会被认为是更好的做法?
作为上下文,我正在构建一个 Python 应用程序,使用 SQLAlchemy 和 SQLite 来测验韩语问题。
我有用户、测验和问题课程。
对于测验问题,所讨论的值为 num_ Correct 和 num_wrong。
基本上我有一个问题表,按 quiz_id 存储与测验相关的所有问题。每个问题都有一个“正确”列,其中存储一个布尔值,表明该问题是否被正确回答。
在我的“测验”表中,我有关于该测验回答的问题的 num_ Correct / num_wrong 列。
在我的“用户”表中,我还有 num_ Correct / num_wrong 列,涉及他们始终正确和错误的总答案。
我意识到,要获取“测验”中的值,我可以查询“问题”表,并获取“用户”中的值,我也可以这样做。
在这种情况下(一般情况下),考虑到最佳实践,哪种策略是首选策略?
我已经尝试过谷歌搜索很多次,但问题的措辞有点棘手。
重复数据的问题在关系数据库中是一个复杂的问题。如果您的应用程序正在进行数据修改,则重复的数据会引发同步问题——需要在多个位置更新数据。
由于多种原因,这很糟糕:
数据库确实通过 ACID 属性、事务和触发器支持此功能。然而,它们增加了开销。一般来说,这种重复是出于必要(即性能)而不是预先添加的。因此,人们强烈倾向于标准化数据模型,其中信息在更新频繁发生时仅存储一次。
另一方面,一些数据库主要用于查询目的。这些数据库通常是非规范化的——而且确实如此。例如,客户表可能包含许多不同维度的摘要,从数十个基础表收集信息。
这不仅简化了查询,而且对业务逻辑进行了编码。使用数据的一个主要问题是,不同的人对事物的定义略有不同——一年期客户是否是 365 天前开始使用的客户?去年同一天开始工作的人?有人已经存在 12 个月了吗?标准化分析表提供了答案。
你的情况似乎更属于第一种情况。您正在进行更新并考虑预先存储摘要。我会劝阻你不要这样做。只需编写汇总数据所需的查询即可。索引和分区很可能会提供您所需的所有性能。
如果您事先知道将有数百万用户参加数百个包含数十个问题的测验,那么您可能需要预先考虑性能优化。但对于成千上万的用户来说,要参加一些包含几十个问题的测验,请从一个简单的数据模型开始,并在证明它有效后将其变得更加复杂。