couchdb-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Nick North <nort...@gmail.com>
Subject Re: Hierarchical comments Hacker News style
Date Wed, 16 May 2012 13:07:29 GMT
It needs someone much better with CouchDb than I am to find a better way.
It feels hard to me, as changing the score of a document near the top of
the tree can potentially move its whole subtree around in the ordering. If
you want your view to contain all the documents in tree order, then
presumably all the documents in that subtree have to be reindexed.

Fortunately most people on this list are much better with CouchDb than I
am, so they may well provide a good solution.

On 16 May 2012 13:53, Luca Matteis <lmatteis@gmail.com> wrote:

> Hi Nick,
> This in fact was also something I came up with. I ditched it because,
> like you said, it requires to update all the descendants. Which means
> a lot of extra overhead. Not only the direct descendants, but all the
> descendants. So a top comment could easily be replied more than 20
> times, and each of those other 20, etc. etc. This would mean that I
> would have to update more than 50 documents each time a user clicks on
> the "upvote" button - not to mention the conflicts.
>
> Isn't there a better way?
>
> On Wed, May 16, 2012 at 2:43 PM, Nick North <north.n@gmail.com> wrote:
> > I may be misunderstanding the problem, but would it work if you represent
> > each comment by a list of its score and its id? Say comments 1, 2, 3, 4
> > have scores 40, 30, 20, 10 respectively, then the documents would become:
> >
> >    { _id: 1, path: [[40,"1"]] },
> >    { _id: 2, path: [[40,"1"], [30,"2"]] },
> >    { _id: 3, path: [[40,"1"], [30,"2"], [20,"3"]] }
> >    { _id: 4, path: [[40,"1"], [10,"4"]] }
> > Then indexing on the path will now put comment 4 before comment 2. If two
> > comments with the same parent have the same score, they will be ordered
> by
> > id. If you want the date in the ordering, that's just another element in
> > the list.
> > The problem with this is that any change to the score of a parent comment
> > requires the paths of all its descendants to be updated. But it feels as
> if
> > that might be inevitable, as changing the parent score may move an entire
> > subtree around in the ordering so the index of all elements of the
> subtree
> > must change.
> >
> > Nick
> >
> > On 16 May 2012 12:27, Luca Matteis <lmatteis@gmail.com> wrote:
> >
> >> I know how the ranking works actually. I described how I'd like to
> >> concentrate on simply ranking each level by its points.
> >> The issue is actually in the adapting this structure to Couch.
> >>
> >> On Wed, May 16, 2012 at 12:26 PM, Tim McNamara
> >> <paperless@timmcnamara.co.nz> wrote:
> >> > It may be worth looking at the reddit  source code (
> >> github.com/reddit/reddit)
> >> > to get some tips. Then you could adapt this into Couch.
> >> > On May 16, 2012 9:41 PM, "Luca Matteis" <lmatteis@gmail.com> wrote:
> >> >
> >> >> I'm trying to implement a basic way of displaying comments in the way
> >> >> that Hacker News provides, using CouchDB. Not only ordered
> >> >> hierarchically, but also, each level of the tree should be ordered
by
> >> >> a "points" variable. If you're familiar with sites such as Hacker
> News
> >> >> or Reddit you know that each level of the comment tree is ordered by
> >> >> the amount of points and also the date they were posted - however,
> for
> >> >> sake of simplicity I'll just talk about a "points" variable.
> >> >>
> >> >> The idea is that I want a view to return it in the order I except,
> and
> >> >> not make many Ajax calls for example, to retrieve them and make them
> >> >> look like they're ordered correctly.
> >> >>
> >> >> This is what I got so far: Each document is a "comment". Each comment
> >> >> has a property `path` which is an ordered list containing all its
> >> >> parents. So for example, imagine I have 4 comments (with _id `1`,
> `2`,
> >> >> `3` and `4`). Comment `2` is children of `1`, comment `3` is children
> >> >> of `2`, and comment `4` is also children of `1`. This is what the
> data
> >> >> would look like:
> >> >>
> >> >>    { _id: 1, path: ["1"] },
> >> >>    { _id: 2, path: ["1", "2"] },
> >> >>    { _id: 3, path: ["1", "2", "3"] }
> >> >>    { _id: 4, path: ["1", "4"] }
> >> >>
> >> >> This works quite well for the hierarchy. A simple `view` will already
> >> >> return things ordered with each comment underneath the correct one.
> >> >>
> >> >> The issue comes when I want to order each "level" of the tree
> >> >> independently. So for example documents `2` and `4` belong to the
> same
> >> >> branch, but are ordered, on that level, by their ID. Instead I want
> >> >> them ordered based on a "points" variable that I want to add to the
> >> >> path - but can't seem to understand where I could be adding this
> >> >> variable for it to work the way I want it.
> >> >>
> >> >> Is there a way to do this? Consider that the "points" variable will
> >> >> change in time.
> >> >>
> >> >> Thank you,
> >> >> Luca
> >> >>
> >>
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message