【问题标题】:Design a share, re-share functionality for a website, avoiding duplication为网站设计共享、重新共享功能,避免重复
【发布时间】:2014-08-20 05:46:51
【问题描述】:

这是我在某处发现的一个有趣的面试问题。详细说明:

您应该为某些网站(例如 facebook 或 linkedin)设计类和数据结构,您的活动可以在其中被共享和重新共享。设计应该避免冗余和重复。

在考虑这个问题时,我被困在here所讨论的“链接与复制”问题上

但由于问题表明应避免重复,我决定采用“链接”方式。这使得共享/重新共享更容易,但删除非常困难。即,如果原始用户删除他们的帖子,则应删除所有共享。 (从编程上讲,指向特定活动的所有对象都应设为空。这是这里的难点,即找到所有指向对象)

【问题讨论】:

  • 使所有链接为空问题的传统解决方案是 404 错误 ;-)

标签: algorithm data-structures language-agnostic


【解决方案1】:

从原始规范来看,删除应该按照您的描述进行,这一点并不明显。可能希望当原始用户删除该项目时,它不会在其他地方被删除;在这种情况下,您不必跟踪所有引用,只需为每个帖子保留一个引用计数,并仅在计数为零时将其从数据库中删除。

如果您确实想要您描述的行为,只需在遇到断开的链接时删除它们就可以实现,这再次使您无需跟踪每个引用。跟踪和更新每个帖子的每个引用的成本被替换为每个引用页面的一次失败查找的可比较成本。不过,后一种情况实现起来更简单,而且成本不会一下子影响到您的服务器。

在现实生活中,无论如何我都会将所有引用实现为双向,因为在您添加功能时迟早会需要它。例如,“喜欢”计数器看起来很简单,但为了防止重复投票,您需要跟踪谁喜欢每个项目,然后如果您想在他们删除个人资料时删除他们的“喜欢”,您需要保留每个用户的出站“喜欢”列表。

实现像 Facebook 这样的东西需要大量的数据库活动...

【讨论】:

  • @bobato :您的第二点..即在遇到链接时删除链接,在这种情况下,如果我们以 facebook 为例,然后在用户登录时删除配置文件上的损坏链接(同时加载他们的墙).. 它不会减慢加载时间吗?但我同意你的大部分观点,我同意这种设计是双向引用和加载/删除时间成本之间的权衡。
  • 移除项目的成本不会降低页面加载速度。当项目加载失败时,您只需跳过渲染它,并将数据库更改排队以异步处理。
【解决方案2】:

保留股份不是更好吗?原用户删除 他们的帖子,很好,它已经消失了。但是每个与之相关的人都应该 不要突然消失在他们身上。

这可以通过 Unix 处理硬链接的方式来完成。 “删除”只是 意味着删除一个指向对象的链接——在 Unix 术语中是一个 inode。你 在链接计数为零之前不要删除对象本身。

【讨论】:

  • 这可能是一个非常政治化的问题——如果我说一些我想收回的话,我应该被允许吗?但是,一旦它出现了,也许这只会给我一种虚假的安全感?
  • @TomZych :在 facebook 上,一旦原始用户删除它们,您就无法保留共享......这就是我从中得出这个概念的地方。
猜你喜欢
  • 2015-08-09
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多