代码之家  ›  专栏  ›  技术社区  ›  rism

希望有一种有效的方法在检索加权和平衡时从数据库中检索记录

  •  1
  • rism  · 技术社区  · 15 年前

    我在做一些非常独特的事情……房产列表网站。;)

    它显示属性列表。对于每个属性,将显示摘要图像和一些标题数据。如果摘要图像和标题引起了网站访问者的兴趣,他们可以单击它并获得完整的属性配置文件。都很标准。

    客户希望能够允许业主添加多个摘要图像,并能够跟踪哪些摘要图像的点击率最高。别担心。

    但他们也希望允许属性所有者对显示的每个摘要图像进行权重控制。因此,对于3个权重为2、6、2的图像,第二个图像将显示6/10次。这需要平衡。如果显示第二个图像的前6次,则在第一个和第三个图像各显示两次之前,不能再次显示该图像。

    所以我既需要增加检索图像的频率,也需要以平衡的方式检索图像。忘记实际的图像处理,我实际上只是在谈论URL。

    注意,增加它被检索的频率与增加它被点击的频率是不同的。

    因此,我可以想出一些不同的方法来使用数据库触发器或一些Linq2SQL等来处理这个问题,但我突然想到,有人会知道一个解决方案,它可能比我想到的要快很多个数量级。

    我的第一个粗略想法是有这样一个模式:

    摘要图像(propid、imageid、imageurl、weighting、retrievedcount、proptotalretrievedcount)

    然后

    select ImageRanks.*
    from (Select t.ImageID, 
                 t.ImageUrl, 
                 rank() over (partition by t.RetrievedCount order by sum(t.RetrievedCount) desc) as IMG_Rank 
           from TeaseImage t
         where t.RetrievedCount<t.Weighting
        group by t.PropID) ImageRanks
    where ImageRanks.IMG_Rank <= 1
    

    然后

     1. for each ImageId in the result set increment RetrievedCount by 1 and then
     2. for each PropId in ResultSet increment PropTotalRetrievedCount by 1 and then 
     3. for each PropId in ResultSet check if PropTotalRetrievedCount ==10 and if so reset it to PropTotalRetrievedCount = 0 and RetrievedCount=0 for each associated ImageId
    

    坦率地说,这听起来很糟糕:(

    那么有什么想法吗? 注意:如果必须退出数据层,我将使用c/.net。谢谢。

    1 回复  |  直到 15 年前
        1
  •  1
  •   Jeff Sternal    15 年前

    如果要在数据库中完全执行此操作,可以将表拆分为两部分:

    Image(ImageId, ImageUrl)
    TeaseImage(TeaseImageId, PropId, ImageId, DateLastAccessed)
    

    这个 TeaseImage 表通过存储每个属性映像对的额外(冗余)副本来管理权重。所以一张重量为6的图像会有6张记录。

    然后,下面的查询将为您提供最近使用的记录。

    select top 1 ti.TeaseImageId, i.ImageUrl
    from         TeaseImage ti
    join         Image i
    on           i.ImageId = ti.ImageId
    where        ti.PropId = @PropId
    order by     ti.DateLastAccessed
    

    在选择之后,只需更新记录的 DateLastAccessed . (或者甚至将其作为选择过程的一部分进行更新,这取决于您需要的容错性。)

    使用此技术可以使您对图像传递顺序进行细粒度控制(通过对 最后访问日期 如果需要的话,您可以很容易地修改比率。

    当然,随着表的增长,额外的记录会比其他方法更早地降低查询性能,但这取决于与其他所有可能不重要的查询相关的查询成本。