2016-11-18 66 views
0

我需要帮助来选择建模解决方案。用于计算一对多关系查询的最佳建模

我有一个表A,其中涉及到表B中的许多其他人。例如:文本(A)和收藏它的用户(B)或产品(A)x评论(B)。

所以...我想知道有多少人收藏了文本或查看了产品。好吧,这很简单,只是这种情况只有一个查询,但当我开始加入更多表时,可能会变得复杂。例如,要查找包含在评论+产品中的评论+照片的评论+照片的平均值,而没有评论,以及评论相关的时候,但仍然因适度而受阻的用户名等。

不过,这是可以做到的,一个查询,我知道,但是...

它是一个更好的解决方案。如果表A有一栏只是为了计算有多少条记录在表B中有关系吗? Like Favorite_Count,review_count,review_avg,...

这会在复杂的查询中“保存连接”,以换取只有一点点编码,当有人喜欢或不喜欢的东西。最后,查询会更容易阅读,并且可能更快,对吗?

您认为如何?

+1

我害怕以这种方式在表格中存储汇总数据。如果你的应用程序行为不端,会有人不得不说,嘿这些数字不匹配,那么你需要一个过程来确保它们匹配,接下来你将管理聚集器运行多久以纠正不良应用程序写入,与此同时,其他应用程序正在网上购买,这些应用程序会为您的聚合带来自己的问题。 GROUP BY和INNER JOINS是你的朋友。也许你可以看看一个只读数据库,报告可能会跑掉并在那里展平你的数据。 –

+0

我看到卡米尔的观点,并在极重读取的情况我能理解的管理更新的信息到您的基表的复杂性被认为的,但我会和罗斯,通常是不需要的并发症,只是为失败的另一点侧。另外,如果你想同时得到详细数据和聚合技术,如分区窗口功能,并将它与正确的索引和优化APPLY能保持读取,即使在高需求的情况下快速 – Matt

+0

是的,我同意了一下你。但是由于系统不会从外部输入输入,所以从API或其他系统不会有更新错误。但无论如何这是一个好点。 不过,要在现实中的例子来看看。这就是我想要做的,它是很难:http://stackoverflow.com/questions/40346096/designing-and-querying-product-review-system 我要考虑封锁和隐藏的审查和产品无评论,除了计算外,还可以对评论进行平均(只有那些未被阻止和隐藏的评论)。 因为我不是一个SQL专家,它ishard给我。 :( – mEba

回答

0

数据检索会更快。数据插入和更新会更慢。这是一个折衷。这取决于比率读取与写入。

这将是非常有价值的你调查例如如何StackOverflow做到这一点。您可以检查数据库模式here

例如,他们把AnswerCountTagsPosts表内,即使他们可以很容易地检索每次有额外分别加入到Posts(层次结构)和PostTags

在我看来,他们为此付出了努力,因为这些信息经常被读取而不是更新。想象一下有多少用户通过帖子列表,每个帖子有多少人点击。要在主页上创建帖子列表,每次有人刷新时都需要额外的时间来执行这些连接。这将是值得注意的流量,不是吗?

但是,这一切都取决于你的情况。在这种情况下没有“最佳方法”。

+0

是的,这里是相同的情况,额外的代码将在更新中完成。/unblock/delete a review。但是,rading会针对每一个产品,也会针对一个大型的,有目的的产品列表。收藏夹容易一些...喜欢或不喜欢会触发该功能。 – mEba

0

我已经对这个问题的索引视图做了很好的体验。这些非常适合计数计算。与“正常”视图相反,记录作为索引存储在Sql-Server中,并且在涉及的表被更改时它们会自动更新。但是,这些都有一些限制,例如模式绑定是强制性的,您只能使用内部连接...。我会创建多个索引视图,然后查询它们。有关更多信息,请参阅MSDN Create Indexed Views

CREATE VIEW dbo.v_productReviewsCount 
    WITH SCHEMABINDING 
AS 
    SELECT T1.productId, 
     COUNT_BIG(*) AS [count] 
    FROM [dbo].[products] T1 
     INNER JOIN [dbo].[reviews] T2 
       ON T1.productId = T2.productId 
    GROUP BY T1.productId 

GO 

CREATE UNIQUE CLUSTERED INDEX ix_productReviewsCount_productId ON dbo.v_productReviewsCount (productId) 

GO