我正在使用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 |
---------------------------------
现在,我需要保持跟踪列表中添加某个项目的次数。为了实现这一点,我有两个可能的选择
请建议哪种方法更好,为什么?我更倾向于采用第二种方法,而且考虑到效率,我猜两者都有相同的
答案 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,除非您发现性能问题会使您想要采用不同的方法。