优化新手:有多少“罪”是冗余?

Pla*_*Ton 3 normalization database-design optimization

我已经开发了一段时间,但以前从未真正处理过数据库/缩放问题。这突然发生了变化,我发现自己陷入了深渊。

我有 2 个 SQL 表,例如:

VOTES
vote_id (PK)
question_id (FK)
user_id (FK)
option_id (FK) <The option the user voted for>
Run Code Online (Sandbox Code Playgroud)

“问题”表如下所示:

QUESTIONS
question_id (PK)
option_1 (FK --> Options)
option_2 (FK --> Options)
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,我经常必须检索某个问题的所有 option_1 票(或 option_2 票)的总和。这是目前通过选择 count where question_id = [@question.id] 和 option_id = [@question.option_1.id]"

我猜将 option_1_votes 和 option_2_votes 列添加到“问题”表并在每次添加投票时增加它们会更快。但归根结底,这是冗余数据。

所以,作为一个对数据库设计原则一无所知的人,这里的经验法则是什么?顶级 DBA 会只是添加列,还是尝试其他解决方案?

干杯...

gbn*_*gbn 6

通常,除非我真的需要,否则我不会添加多余的列。

在任何 RDBMS 中,对一组数据运行 COUNT 都是非常有效的。

考虑到这是对索引(希望)缓存数据的读取以获取计数将击败第二次写入以维护非规范化列。此写入需要更多资源/锁定/更长的事务等,这会影响读取更多

如果性能随着时间的推移成为一个问题,那么您可以使用索引(又名物化)视图更有效地预先计算 COUNT