SQL表访问:许多访问一项或多项访问更好?

时间:2018-07-03 14:49:52

标签: sql

我正在为数字图书馆的书籍制作一些SQL表。我有一个表格“ book”,其中大部分存储着有关每本书的静态信息。

我的另一个表是“ ownedBook”,它存储与拥有书籍的用户有关的书籍数据。

当用户阅读书籍时,我想经常更新数据库,以了解他们花在每本书上的时间(以秒为单位)。问题:

对于我的sql数据库,让许多用户将时间添加到一个表的“ book”列中是否更有效?还是应该在“ ownedBook”表中记录该时间?

同时考虑这两个选项:如果保存在“书”表中,则“书”中的一行将非常频繁地更新,因为不同的用户将时间(他们花在某本书上的秒数)添加到一列中。那可能很不好,但是在另一方面,可以很容易地查明人们花了多少时间看那本书。

另一方面,如果这次记录在“ ownedBook”表中,则一次仅更新其中的一行,并且更新的频率要少得多,但是要弄清楚读者花了多少时间看然后,每本书将涉及获取所有“所有书”并累加用户在每本书中的累积时间。

任何帮助表示赞赏! -不是外星人

2 个答案:

答案 0 :(得分:0)

如果仅存储每本书的总时间,则会丢失每位用户每本书花费的时间信息。我假设您不想丢失此信息。按照该假设,您想存储每位用户每本书的总时间(在ownBook表中)。我假设您还希望经常查询每本书的总时间,所以为了避免性能问题,您可能还想通过同时存储每本书的总时间(在书表中)来denormalize数据。

由于您正在设计此功能以支持高频更新,因此建议将第三个表作为队列。我们称它为bookReading。除了直接更新其他表格以外,您应在此表格中为来自用户的每次更新(即用户ID,图书ID,read_started_timestamp,read_ended_timestamp)插入新行。这应该支持高频率的插入(不要设置外键以获得更快的性能)。然后,您可以设置一个定期执行的定期任务(例如,每五秒钟执行一次),该任务一次性处理所有累积的阅读:更新book和ownBook表中的总时间,并从bookReading中删除已处理的阅读。

这应该使您在写入和读取(查询)方面都具有良好的性能。

答案 1 :(得分:0)

我会选择2个表格选项。 1张桌子存放书籍,1张桌子存放阅读者和阅读时间。 此外,每个表中都需要一个相同的字段,将两个表链接在一起。 这将是books表中的唯一字段,也许是ISBN号,如果没有这些字段,则可以让SQL使用newid()为您创建一个唯一标识符。您不必向任何人显示此字段。 这有助于保持数据一致。