On Wed, Jan 22, 2014 at 06:44:20PM +0100, Kasper Middelboe Petersen wrote:
>    I'm a little worried about the data model I have come up with for handling
>    highscores.
>    I have a lot of users. Each user has a number of friends. I need a
>    highscore list pr friend list.
>    I would like to have it optimized for reading the highscores as opposed to
>    setting a new highscore as the use case would suggest I would need to read
>    the list a lot more than I would need write new highscores.
>    Currently I have the following tables:
>    CREATE TABLE user (userId uuid, name varchar, highscore int, bestcombo
>    int, PRIMARY KEY(userId))
>    CREATE TABLE highscore (userId uuid, score int, name varchar, PRIMARY
>    KEY(userId, score, name)) WITH CLUSTERING ORDER BY (score DESC);
>    ... and a tables for friends - for the purpose of this mail assume
>    everyone is friends with everyone else
>    Reading the highscore list for a given user is easy. SELECT * FROM
>    highscores WHERE userId = <id>.
>    Problem is setting a new highscore.
>    1. I need to read-before-write to get the old score
>    2. I'm screwed if something goes wrong and the old score gets overwritten
>    before all the friends highscore lists gets updated - and it is an highly
>    visible error due to the same user is on the highscore multiple times.
>    I would very much appreciate some feedback and/or alternatives to how to
>    solve this with Cassandra.

Is friendship symmetrical? Why not just store the scores in the friend
list like so:

CREATE TABLE friends (
  userID      uuid,
  friendID    uuid,
  name        varchar,
  score       int,
  PRIMARY KEY (userID, friendID)
);

and then simply sort the friends by score in your application code?

When you update a user's score, you just do something like:

  UPDATE friends SET score=x WHERE userID IN (all,my,friends) AND friendID=myID;

It should be quite efficient unless you have people with truly
ludicrous numbers of 'friends' ;-)

Reply via email to