如何计算添加特定项目的时间?

时间:2011-07-17 04:35:30

标签: asp.net database

我正在使用C#开发在ASP.Net中开发的Web应用程序。 Allong具有其他功能,有一项功能允许用户将各种项目添加到他们的个人列表中。与上述功能相关的数据库表是:

-------------------------
| Item                  |
-------------------------
| ItemId (Primary Key)  |
| . . . & other attribs |
-------------------------

---------------------------
|List                     |
---------------------------
|ListId (Primary Key)     |
|. . . and other attribs  |
---------------------------

由于上面两个表之间存在多对多的关系(即一个项目被添加到许多列表中,一个列表包含许多项目)所以我创建了第三个表格

---------------------------------
|ItemList                       |
---------------------------------
|ItemId (Foreign Key)           |
|ListId (Foreign Key)           |
|. . . and other Attributes     |
---------------------------------

现在,我需要保持跟踪列表中添加某个项目的次数。为了实现这一点,我有两个可能的选择

  1. 我在Item表中添加一个新属性,并在每次将特定项添加到某个列表时将该值增加一个。
  2. 第二个选择是每当我需要知道多少时 在列表中添加特定项目的时间,然后我将应用 ItemList表上的SELECT Count Query(带where子句)
  3. 请建议哪种方法更好,为什么?我更倾向于采用第二种方法,而且考虑到效率,我猜两者都有相同的

2 个答案:

答案 0 :(得分:2)

从数据纯度的角度来看,第二种方法更好。让数据告诉它自己的自然故事 - 如果你能通过快速Select count(ListId), ItemID as CountOfLists from ItemList Group By ItemID计算一个项目所在的列表数量,那么它比找到修改的代码中的所有点更有吸引力。 {1}}并确保他们更新ItemList

如果您出于性能原因希望对数据进行非规范化/预聚合,则需要考虑第一个选项 。您必须做额外的工作以确保Item表中的Count列始终准确(或eventually准确)

答案 1 :(得分:2)

选项#1对读取操作的性能更好,因为计数已经聚合。这种方法的缺点是你必须:

  • 在您的应用程序中为每次插入和删除手动更新此号码。
  • 每次将项目添加到列表时更新此编号。如果您的应用程序写入读取比率很高,则可能不值得付出努力

如果您的应用程序与读取相比具有更多插入/删除,则选项#2将表现更好。原因是SQL Server只需要在需要时计算计数。

我建议使用选项#2,除非您发现性能问题会使您想要采用不同的方法。