cassandra day chicago 2015: advanced data modeling

73
Cassandra Data Advanced Modeling Aumcfshmvoe Aqbusjdlndgbejo

Upload: planet-cassandra

Post on 15-Jul-2015

366 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: Cassandra Day Chicago 2015: Advanced Data Modeling

CassandraData

Advanced

Modeling

Page 2: Cassandra Day Chicago 2015: Advanced Data Modeling

Let UsAssume:

• You%know%your%way%around%a%cluster(at%least%theore4cally)%

• You%have%seen%some%CQL

Page 3: Cassandra Day Chicago 2015: Advanced Data Modeling

Let UsExplore:

• Some%use%cases%• The%Chebotko%Method%• Some%Cassandra%2.1%features

Page 4: Cassandra Day Chicago 2015: Advanced Data Modeling

Use Cases

Page 5: Cassandra Day Chicago 2015: Advanced Data Modeling

Top Gamer Scores

Page 6: Cassandra Day Chicago 2015: Advanced Data Modeling

TopScores

Page 7: Cassandra Day Chicago 2015: Advanced Data Modeling

TopScores

Page 8: Cassandra Day Chicago 2015: Advanced Data Modeling

TopScores

Page 9: Cassandra Day Chicago 2015: Advanced Data Modeling

TopScores

Page 10: Cassandra Day Chicago 2015: Advanced Data Modeling

TopScores Daily Top 10 Users

handle | score -----------------+------- subsonic | 66.2 neo | 55.2 bennybaru | 49.2 tigger | 46.2 velvetfog | 45.2 flashberg | 43.6 jbellis | 43.4 cafruitbat | 43.2 groovemerchant | 41.2 rustyrazorblade | 39.2

Page 11: Cassandra Day Chicago 2015: Advanced Data Modeling

TopScores

CREATE TABLE userScores (userId uuid, handle text static, gameId uuid, score_timestamp timestamp, score double, PRIMARY KEY ((userId, gameId), score_timestamp)) WITH CLUSTERING ORDER BY (score_timestamp DESC);

Page 12: Cassandra Day Chicago 2015: Advanced Data Modeling

TopScoresCREATE TABLE TopTen ( gameId uuid, process_timestamp timestamp, score double, userId uuid, handle text, PRIMARY KEY (gameId, process_timestamp, score)) WITH CLUSTERING ORDER BY (process_timestamp DESC, score DESC)AND default_time_to_live = '259200'AND COMPACTION = {'class': 'DateTieredCompactionStrategy', 'enabled': 'TRUE'};

Page 13: Cassandra Day Chicago 2015: Advanced Data Modeling

TopScores

SELECT gameId, process_timestamp, score, handle, userIdFROM TopTenWHERE gameid = 99051fe9-6a9c-46c2-b949-38ef78858dd0AND process_timestamp <= '2014-12-31 14:00:00'LIMIT 1;

CREATE TABLE TopTen ( gameId uuid, process_timestamp timestamp,

Page 14: Cassandra Day Chicago 2015: Advanced Data Modeling

TopScores

SELECT gameId, process_timestamp, score, handle, userIdFROM TopTenWHERE gameid = 99051fe9-6a9c-46c2-b949-38ef78858dd0AND process_timestamp <= '2014-12-31 14:00:00'

gameid | process_timestamp | score | handle | userid --------------------------------------+ --------------------------+-------+-----------------+-------------------------------------- 99051fe9-6a9c-46c2-b949-38ef78858dd0 | 2014-12-31 13:42:40-0800 | 66.2 | trinity | 99051fe9-6a9c-46c2-b949-38ef78858dd0 | 2014-12-31 13:42:40-0800 | 55.2 | neo | 99051fe9-6a9c-46c2-b949-38ef78858dd0 | 2014-12-31 13:42:40-0800 | 49.2 | bennbaru | 99051fe9-6a9c-46c2-b949-38ef78858dd0 | 2014-12-31 13:42:40-0800 | 46.2 | tigger | 99051fe9-6a9c-46c2-b949-38ef78858dd0 | 2014-12-31 13:42:40-0800 | 45.2 | velvetfog | 99051fe9-6a9c-46c2-b949-38ef78858dd0 | 2014-12-31 13:42:40-0800 | 43.6 | flashberg | 99051fe9-6a9c-46c2-b949-38ef78858dd0 | 2014-12-31 13:42:40-0800 | 43.4 | jbellis | 99051fe9-6a9c-46c2-b949-38ef78858dd0 | 2014-12-31 13:42:40-0800 | 43.2 | catfruitbat | 99051fe9-6a9c-46c2-b949-38ef78858dd0 | 2014-12-31 13:42:40-0800 | 41.2 | groovemerchant | 99051fe9-6a9c-46c2-b949-38ef78858d03 99051fe9-6a9c-46c2-b949-38ef78858dd0 | 2014-12-31 13:42:40-0800 | 39.2 | rustyrazorblade | 99051fe9-6a9c-46c2-b949-38ef78858d01 99051fe9-6a9c-46c2-b949-38ef78858dd0 | 2014-12-31 13:42:40-0800 | 20.2 | driftx | 99051fe9-6a9c-46c2-b949-38ef78858d08

Page 15: Cassandra Day Chicago 2015: Advanced Data Modeling

Yay!

Page 16: Cassandra Day Chicago 2015: Advanced Data Modeling

Spark?

Page 17: Cassandra Day Chicago 2015: Advanced Data Modeling

File Storage

Page 18: Cassandra Day Chicago 2015: Advanced Data Modeling

FileStorage

Page 19: Cassandra Day Chicago 2015: Advanced Data Modeling

FileStorage

Page 20: Cassandra Day Chicago 2015: Advanced Data Modeling

Stories(In(Brief

• User%creates%an%account%%• User%uploads%image%• Image%is%distributed%worldwide%%• User%can%check%access%paHerns%

FileStorage

Page 21: Cassandra Day Chicago 2015: Advanced Data Modeling

• Recall%a%single%image%• Recall%all%images%in%a%given%4me%range%• Recall%specific%images%over%a%given%4me%range%• Recall%the%4mes%each%image%was%accessed

FileStorage Access(Pa1erns

Page 22: Cassandra Day Chicago 2015: Advanced Data Modeling

CREATE TABLE user ( username text, firstname text, lastname text, emails list<text>, PRIMARY KEY (username));

FileStorage User%Crea(on

Page 23: Cassandra Day Chicago 2015: Advanced Data Modeling

INSERT INTO user (username, firstname, lastname, emails) VALUES ('tlberglund', 'Tim' 'Berglund' ['[email protected]', '[email protected]'])IF NOT EXISTS;

FileStorage User%Crea(on

Page 24: Cassandra Day Chicago 2015: Advanced Data Modeling

CREATE TABLE image ( image_id, username, created_at, image_name, image_description text, tags list<text>, images map<text, uuid>, PRIMARY KEY (image_id));

FileStorage Image%Model

Page 25: Cassandra Day Chicago 2015: Advanced Data Modeling

CREATE TABLE images_timeseries ( username text, bucket int, sequence timestamp, image_id uuid, image_name text, image_description text, images map<text, uuid>, PRIMARY KEY ((username, bucket), sequence)) WITH CLUSTERING ORDER BY (sequence DESC);

FileStorage Image%Accesses

Page 26: Cassandra Day Chicago 2015: Advanced Data Modeling

CREATE TABLE bucket_index ( username text, bucket int,PRIMARY KEY(username, bucket)) WITH CLUSTERING ORDER BY (bucket DESC);

FileStorage Image%Buckets

Page 27: Cassandra Day Chicago 2015: Advanced Data Modeling

CREATE TABLE blob ( object_id uuid, // unique identifier chunk_count int, // total number of chunks size int, // total size (bytes) chunk_size int, // max chunk size checksum text, attributes text, // json-encoded metadata PRIMARY KEY (object_id));

FileStorage Chunked%Blobs

Page 28: Cassandra Day Chicago 2015: Advanced Data Modeling

CREATE TABLE blob_chunk ( object_id uuid, chunk_id int, chunk_size int, data blob, PRIMARY KEY ((object_id, chunk_id)));

FileStorage Chunked%Blobs

Page 29: Cassandra Day Chicago 2015: Advanced Data Modeling

CREATE TABLE access_log ( object_id uuid, access_date text, access_time timestamp, ip_address inet, PRIMARY KEY ((object_id, access_date), access_time, ip_address));

FileStorage Access%Log

Page 30: Cassandra Day Chicago 2015: Advanced Data Modeling

User Registration

Page 31: Cassandra Day Chicago 2015: Advanced Data Modeling

UserRegistration LWT

Page 32: Cassandra Day Chicago 2015: Advanced Data Modeling

SELECT *FROM usersWHERE userName = 'tlberglund'

Coordinator%1 Coordinator%2

Page 33: Cassandra Day Chicago 2015: Advanced Data Modeling

SELECT *FROM usersWHERE userName = 'tlberglund' SELECT *

FROM usersWHERE userName = 'pmcfadin'

Coordinator%1 Coordinator%2

Page 34: Cassandra Day Chicago 2015: Advanced Data Modeling

SELECT *FROM usersWHERE userName = 'tlberglund' SELECT *

FROM usersWHERE userName = 'pmcfadin'

INSERT INTO users (username, ...)VALUES ('tlberglund',...);

Coordinator%1 Coordinator%2

Page 35: Cassandra Day Chicago 2015: Advanced Data Modeling

SELECT *FROM usersWHERE userName = 'tlberglund' SELECT *

FROM usersWHERE userName = 'pmcfadin'

INSERT INTO users (username, ...)VALUES ('tlberglund',...); INSERT INTO users (username, ...)

VALUES ('pmcfadin',...);

Coordinator%1 Coordinator%2

Page 36: Cassandra Day Chicago 2015: Advanced Data Modeling

INSERT INTO users (username, ...)VALUES ('tlberglund',...); INSERT INTO users (username, ...)

VALUES ('pmcfadin',...);

LWT

Which user wins?

UserRegistration

Page 37: Cassandra Day Chicago 2015: Advanced Data Modeling

LWT

• Lightweight)transac/ons)

• Uses)the)Paxos)algorithm)

• Hard)to)understand)

• So$easy$to$use

UserRegistration

Page 38: Cassandra Day Chicago 2015: Advanced Data Modeling

Coordinator%1 Coordinator%2

Page 39: Cassandra Day Chicago 2015: Advanced Data Modeling

INSERT INTO users (username, ...)VALUES (‘tlberglund',...)IF NOT EXISTS;

Coordinator%1 Coordinator%2

Page 40: Cassandra Day Chicago 2015: Advanced Data Modeling

INSERT INTO users (username, ...)VALUES (‘tlberglund',...)IF NOT EXISTS;

INSERT INTO users (username, ...)VALUES (‘pmcfadin',...)IF NOT EXISTS;

Coordinator%1 Coordinator%2

Page 41: Cassandra Day Chicago 2015: Advanced Data Modeling

Paxos%Write:%Happy%PathNODE

NODE

NODE

NODE

FLAT%WHITE

Page 42: Cassandra Day Chicago 2015: Advanced Data Modeling

Paxos%Write:%Happy%PathNODE

NODE

NODE

NODE

FLAT%WHITE

1. Prepare

Page 43: Cassandra Day Chicago 2015: Advanced Data Modeling

Paxos%Write:%Happy%Path

PROPOSER

FLAT%WHITE

Proposer generates

a sequence number

1. Prepare

Page 44: Cassandra Day Chicago 2015: Advanced Data Modeling

Paxos%Write:%Happy%Path

PROPOSER

1:FLAT%WHITE

1:FLAT%WHITE

1:FLAT%WHITE

1:FLAT%WHITE

1. Prepare

Page 45: Cassandra Day Chicago 2015: Advanced Data Modeling

Paxos%Write:%Happy%PathACCEPTOR

ACCEPTOR

ACCEPTOR

PROPOSER

Acceptors compare sequence numbers1:FLAT%WHITE

1:FLAT%WHITE

1:FLAT%WHITE

2 . Promise

Page 46: Cassandra Day Chicago 2015: Advanced Data Modeling

Paxos%Write:%Happy%PathACCEPTOR

ACCEPTOR

ACCEPTOR

PROPOSER

Proposer receives

quorum, “makes

progress”

3. Accept Request

1:FLAT%WHITE

1:FLAT%WHITE

1:FLAT%WHITE

Page 47: Cassandra Day Chicago 2015: Advanced Data Modeling

Paxos%Write:%Happy%Path

PROPOSER

FLAT%WHITE

4. Acceptance

1:FLAT%WHITE

1:FLAT%WHITE

1:FLAT%WHITE

ACCEPTOR

ACCEPTOR

ACCEPTOR

Acceptors check sequence numbers one more time

Page 48: Cassandra Day Chicago 2015: Advanced Data Modeling

Paxos%Write:%BeLer%OfferACCEPTOR

ACCEPTOR

ACCEPTOR

PROPOSER

5:CAFÉ%CUBANO

5:CAFÉ%C

UBANO

5:CAFÉ%CUBANO

5:CAFÉ%CUBANO

1. Prepare

Page 49: Cassandra Day Chicago 2015: Advanced Data Modeling

Paxos%Write:%BeLer%Offer

ACCEPTOR

1. Prepare

8:FRENCH%PRESS

Meanwhile, this node had

gotten another proposal

when we weren’t looking…

Page 50: Cassandra Day Chicago 2015: Advanced Data Modeling

Paxos%Write:%BeLer%OfferACCEPTOR

ACCEPTOR

ACCEPTOR

PROPOSER

8:FRENC

H%PRESS

5:CAFÉ%CUBANO

5:CAFÉ%CUBANO

2 . Promise

Page 51: Cassandra Day Chicago 2015: Advanced Data Modeling

Paxos%Write:%BeLer%OfferACCEPTOR

ACCEPTOR

ACCEPTOR

PROPOSER

Proposer changes

its mind!

3. Accept Request

8:FRENC

H%PRESS

8:FRENCH%PRESS

8:FRENCH%PRESS8:FRENCH%PRESS

Page 52: Cassandra Day Chicago 2015: Advanced Data Modeling

Paxos%Write:%BeLer%Offer

PROPOSER

FRENCH%PRESS

4. Acceptance

8:FRENC

H%PRESS

8:FRENCH%PRESS

8:FRENCH%PRESS

ACCEPTOR

ACCEPTOR

ACCEPTOR

Two acceptors are

surprised about this,

but the sequence

numbers work out…

Page 53: Cassandra Day Chicago 2015: Advanced Data Modeling

LightweightTransactions

• Good)solu/on)for)distributed)race)

condi/ons)

• At)some)cost)in)latency)

• Run)your)own)load)tests!)

• Now…why)were)you)using)ZooKeeper?

Page 54: Cassandra Day Chicago 2015: Advanced Data Modeling

When ComplexDomainsAttack

Page 55: Cassandra Day Chicago 2015: Advanced Data Modeling

Dr . Chebotko’sData Modeling

Emporium

Page 56: Cassandra Day Chicago 2015: Advanced Data Modeling

• Conceptual)model)

• Logical)model)

• Physical)model

ChebotkoMethod

Page 57: Cassandra Day Chicago 2015: Advanced Data Modeling

• Abstract,)implementa/onHindependent)model)

• Tradi/onally)built)in)Chen)ER)nota/on)

• Describes)en//es,)rela/onships,)roles,)keys,)

and)cardinali/es

ChebotkoMethod Conceptual%Model

Page 58: Cassandra Day Chicago 2015: Advanced Data Modeling

ChebotkoMethod Conceptual%Model

Album

titleyear genre

releasesPerformername

founded

country

1 n

style

IsA

ArtistBand

disjoint5covering

born

died

has3member

n m

period

format

cover5image

numbertitle

1

n

Track

has

User

id

email

name

preferences

performs

m

1

involvedIn

1

n

IsA

RatePlay

disjoint5not5covering

Activity

id

timestamp

rating

Page 59: Cassandra Day Chicago 2015: Advanced Data Modeling

ChebotkoMethod Logical%Model

• A)diagram)showing)queries)and)tables)

• Ensures)that)each)query)“fits”)in)a)par//on)

• Tends)to)produce)one)table)per)query

Page 60: Cassandra Day Chicago 2015: Advanced Data Modeling

ChebotkoMethod Logical%Model

1. Iden/fy)access)paTerns)(“queries”))

2. Find)a)subset)of)the)conceptual)model)that)

sa/sfies)a)query)

3. Determine)key)

4. Verify)maximum)par//on)size

Page 61: Cassandra Day Chicago 2015: Advanced Data Modeling

ChebotkoMethod Logical%Model

Q1

ACCESS%PATTERNSQ1:$Find$performers$for$a$specified$style;$order$by$performer$(ASC).Q2:$Find$information$for$a$specified$performer$(artist$or$band).Q3:$Find$information$for$a$specified$album$(title$and$year).Q4:$Find$albums$for$a$specified$performer;$order$by$album$release$year$(DESC)$and$title$(ASC).Q5:$Find$albums$for$a$specified$genre;$order$by$performer$(ASC),$year$(DESC),$and$title$(ASC).Q6:$Find$albums$and$performers$for$a$specified$track$title;$order$by$performer$(ASC),$year$(DESC),$and$title$(ASC).Q7:$Find$tracks$for$a$specified$album$(title$and$year);$order$by$track$number$(ASC).Q8:$Find$information$for$a$specified$user.Q9:$Find$activities$for$a$specified$user;$order$by$activity$time$(DESC).Q10:$Find$statistics$for$a$specified$track.Q11:$Find$user$activities$for$a$specified$track;$order$by$activity$time$(DESC).Q12:$Find$user$activities$for$a$specified$activity$type.…

Performer

name Ktypecountrystylefoundedborndied

Performers_by_style

style Kname C�

Albums_by_performer

performer $$$$Kyear $$$$C�title $$$$C�genre

Albums_by_genre

genre Kperformer$ C�year C�title C�

Tracks_by_album

album Kyear Knumber $ C�performer$ Sgenre Stitle

Albums_by_track

track Kperformer$ C�year C�title C�

Album

title Kyear Kperformergenretracks$(map)

Q2

Q2

Q4

Q3

Q3

Q4

Q5

Q5

Q6

Q1

Q3

Q3

Q7

Q7

Q7

User

id Kname$emailpreferences$(set)

Q8

Activities_by_user

user Kactivity (timeuuid) C�type IDXalbum_titlealbum_yeartrack_titlerating

Activities_by_track

album_title Kalbum_year Ktrack_title Kactivity$(timeuuid) C�usertyperating Track_stats

album_title Kalbum_year Ktrack_title Knum_ratings$(counter)sum_ratings$(counter)num_plays$(counter)

Q9

Q8

Q10

Q11

Q12

Page 62: Cassandra Day Chicago 2015: Advanced Data Modeling

Q1

ACCESS%PATTERNSQ1:$Find$performers$for$a$specified$style;$order$by$performer$(ASC).Q2:$Find$information$for$a$specified$performer$(artist$or$band).Q3:$Find$information$for$a$specified$album$(title$and$year).Q4:$Find$albums$for$a$specified$performer;$order$by$album$release$year$(DESC)$and$title$(ASC).Q5:$Find$albums$for$a$specified$genre;$order$by$performer$(ASC),$year$(DESC),$and$title$(ASC).Q6:$Find$albums$and$performers$for$a$specified$track$title;$order$by$performer$(ASC),$year$(DESC),$and$title$(ASC).Q7:$Find$tracks$for$a$specified$album$(title$and$year);$order$by$track$number$(ASC).Q8:$Find$information$for$a$specified$user.Q9:$Find$activities$for$a$specified$user;$order$by$activity$time$(DESC).Q10:$Find$statistics$for$a$specified$track.Q11:$Find$user$activities$for$a$specified$track;$order$by$activity$time$(DESC).Q12:$Find$user$activities$for$a$specified$activity$type.…

Performer

name Ktypecountrystylefoundedborndied

Performers_by_style

style Kname C�

Albums_by_performer

performer $$$$Kyear $$$$C�title $$$$C�genre

Albums_by_genre

genre Kperformer$ C�year C�title C�

Tracks_by_album

album Kyear Knumber $ C�performer$ Sgenre Stitle

Albums_by_track

track Kperformer$ C�year C�title C�

Album

title Kyear Kperformergenretracks$(map)

Q2

Q2

Q4

Q3

Q3

Q4

Q5

Q5

Q6

Q1

Q3

Q3

Q7

Q7

Q7

User

id Kname$emailpreferences$(set)

Q8

Activities_by_user

user Kactivity (timeuuid) C�type IDXalbum_titlealbum_yeartrack_titlerating

Activities_by_track

album_title Kalbum_year Ktrack_title Kactivity$(timeuuid) C�usertyperating Track_stats

album_title Kalbum_year Ktrack_title Knum_ratings$(counter)sum_ratings$(counter)num_plays$(counter)

Q9

Q8

Q10

Q11

Q12

Page 63: Cassandra Day Chicago 2015: Advanced Data Modeling

Q1

ACCESS%PATTERNSQ1:$Find$performers$for$a$specified$style;$order$by$performer$(ASC).Q2:$Find$information$for$a$specified$performer$(artist$or$band).Q3:$Find$information$for$a$specified$album$(title$and$year).Q4:$Find$albums$for$a$specified$performer;$order$by$album$release$year$(DESC)$and$title$(ASC).Q5:$Find$albums$for$a$specified$genre;$order$by$performer$(ASC),$year$(DESC),$and$title$(ASC).Q6:$Find$albums$and$performers$for$a$specified$track$title;$order$by$performer$(ASC),$year$(DESC),$and$title$(ASC).Q7:$Find$tracks$for$a$specified$album$(title$and$year);$order$by$track$number$(ASC).Q8:$Find$information$for$a$specified$user.Q9:$Find$activities$for$a$specified$user;$order$by$activity$time$(DESC).Q10:$Find$statistics$for$a$specified$track.Q11:$Find$user$activities$for$a$specified$track;$order$by$activity$time$(DESC).Q12:$Find$user$activities$for$a$specified$activity$type.…

Performer

name Ktypecountrystylefoundedborndied

Performers_by_style

style Kname C�

Albums_by_performer

performer $$$$Kyear $$$$C�title $$$$C�genre

Albums_by_genre

genre Kperformer$ C�year C�title C�

Tracks_by_album

album Kyear Knumber $ C�performer$ Sgenre Stitle

Albums_by_track

track Kperformer$ C�year C�title C�

Album

title Kyear Kperformergenretracks$(map)

Q2

Q2

Q4

Q3

Q3

Q4

Q5

Q5

Q6

Q1

Q3

Q3

Q7

Q7

Q7

User

id Kname$emailpreferences$(set)

Q8

Activities_by_user

user Kactivity (timeuuid) C�type IDXalbum_titlealbum_yeartrack_titlerating

Activities_by_track

album_title Kalbum_year Ktrack_title Kactivity$(timeuuid) C�usertyperating Track_stats

album_title Kalbum_year Ktrack_title Knum_ratings$(counter)sum_ratings$(counter)num_plays$(counter)

Q9

Q8

Q10

Q11

Q12

Page 64: Cassandra Day Chicago 2015: Advanced Data Modeling

Q1

ACCESS%PATTERNSQ1:$Find$performers$for$a$specified$style;$order$by$performer$(ASC).Q2:$Find$information$for$a$specified$performer$(artist$or$band).Q3:$Find$information$for$a$specified$album$(title$and$year).Q4:$Find$albums$for$a$specified$performer;$order$by$album$release$year$(DESC)$and$title$(ASC).Q5:$Find$albums$for$a$specified$genre;$order$by$performer$(ASC),$year$(DESC),$and$title$(ASC).Q6:$Find$albums$and$performers$for$a$specified$track$title;$order$by$performer$(ASC),$year$(DESC),$and$title$(ASC).Q7:$Find$tracks$for$a$specified$album$(title$and$year);$order$by$track$number$(ASC).Q8:$Find$information$for$a$specified$user.Q9:$Find$activities$for$a$specified$user;$order$by$activity$time$(DESC).Q10:$Find$statistics$for$a$specified$track.Q11:$Find$user$activities$for$a$specified$track;$order$by$activity$time$(DESC).Q12:$Find$user$activities$for$a$specified$activity$type.…

Performer

name Ktypecountrystylefoundedborndied

Performers_by_style

style Kname C�

Albums_by_performer

performer $$$$Kyear $$$$C�title $$$$C�genre

Albums_by_genre

genre Kperformer$ C�year C�title C�

Tracks_by_album

album Kyear Knumber $ C�performer$ Sgenre Stitle

Albums_by_track

track Kperformer$ C�year C�title C�

Album

title Kyear Kperformergenretracks$(map)

Q2

Q2

Q4

Q3

Q3

Q4

Q5

Q5

Q6

Q1

Q3

Q3

Q7

Q7

Q7

User

id Kname$emailpreferences$(set)

Q8

Activities_by_user

user Kactivity (timeuuid) C�type IDXalbum_titlealbum_yeartrack_titlerating

Activities_by_track

album_title Kalbum_year Ktrack_title Kactivity$(timeuuid) C�usertyperating Track_stats

album_title Kalbum_year Ktrack_title Knum_ratings$(counter)sum_ratings$(counter)num_plays$(counter)

Q9

Q8

Q10

Q11

Q12

Page 65: Cassandra Day Chicago 2015: Advanced Data Modeling

Q1

ACCESS%PATTERNSQ1:$Find$performers$for$a$specified$style;$order$by$performer$(ASC).Q2:$Find$information$for$a$specified$performer$(artist$or$band).Q3:$Find$information$for$a$specified$album$(title$and$year).Q4:$Find$albums$for$a$specified$performer;$order$by$album$release$year$(DESC)$and$title$(ASC).Q5:$Find$albums$for$a$specified$genre;$order$by$performer$(ASC),$year$(DESC),$and$title$(ASC).Q6:$Find$albums$and$performers$for$a$specified$track$title;$order$by$performer$(ASC),$year$(DESC),$and$title$(ASC).Q7:$Find$tracks$for$a$specified$album$(title$and$year);$order$by$track$number$(ASC).Q8:$Find$information$for$a$specified$user.Q9:$Find$activities$for$a$specified$user;$order$by$activity$time$(DESC).Q10:$Find$statistics$for$a$specified$track.Q11:$Find$user$activities$for$a$specified$track;$order$by$activity$time$(DESC).Q12:$Find$user$activities$for$a$specified$activity$type.…

Performer

name Ktypecountrystylefoundedborndied

Performers_by_style

style Kname C�

Albums_by_performer

performer $$$$Kyear $$$$C�title $$$$C�genre

Albums_by_genre

genre Kperformer$ C�year C�title C�

Tracks_by_album

album Kyear Knumber $ C�performer$ Sgenre Stitle

Albums_by_track

track Kperformer$ C�year C�title C�

Album

title Kyear Kperformergenretracks$(map)

Q2

Q2

Q4

Q3

Q3

Q4

Q5

Q5

Q6

Q1

Q3

Q3

Q7

Q7

Q7

User

id Kname$emailpreferences$(set)

Q8

Activities_by_user

user Kactivity (timeuuid) C�type IDXalbum_titlealbum_yeartrack_titlerating

Activities_by_track

album_title Kalbum_year Ktrack_title Kactivity$(timeuuid) C�usertyperating Track_stats

album_title Kalbum_year Ktrack_title Knum_ratings$(counter)sum_ratings$(counter)num_plays$(counter)

Q9

Q8

Q10

Q11

Q12

Page 66: Cassandra Day Chicago 2015: Advanced Data Modeling

ChebotkoMethod Logical%Model%Analysis

• Natural)or)surrogate)keys?)

• Are)write)conflicts)(overwrites))possible?)

• What)data)types)to)use?)

• How)large)are)par//ons?)

• How)much)data)duplica/on)is)required?)

• Are)clientHside)joins)required)and)at)what)cost?)

• Are)data)consistency)anomalies)possible?)

• How)to)enable)transac/ons?

Page 67: Cassandra Day Chicago 2015: Advanced Data Modeling

ChebotkoMethod Physical%Model

• Not)a)diagram!)

• Just)the)CQL)version)of)the)logical)

tables

Page 68: Cassandra Day Chicago 2015: Advanced Data Modeling

C* 2 .1 FeaturesBonus!

Page 69: Cassandra Day Chicago 2015: Advanced Data Modeling

User-DefinedTypes

Page 70: Cassandra Day Chicago 2015: Advanced Data Modeling

UDTs• Good)for)modeling)nested)

“value)objects”)

• Eliminates)extra)queries,)inH

app)joins)

• Mechanism)for)

denormaliza/on

CREATE TYPE address ( street text, city text, zip_code int, country text, cross_streets set<text>);

Page 71: Cassandra Day Chicago 2015: Advanced Data Modeling

UDTsCREATE TABLE videos ( videoid uuid, userid uuid, name varchar, description varchar, location text, location_type int, preview_thumbnails map<text,text>, tags set<varchar>, added_date timestamp, PRIMARY KEY (videoid));

CREATE TABLE video_metadata ( video_id uuid PRIMARY KEY, height int, width int, video_bit_rate set<text>, encoding text);

SELECT *FROM videosWHERE videoId = 2;

SELECT *FROM video_metadata WHERE videoId = 2;

InQapp%%Join

Page 72: Cassandra Day Chicago 2015: Advanced Data Modeling

CREATE TYPE video_metadata ( height int, width int, video_bit_rate set<text>, encoding text);

UDTsCREATE TABLE videos ( videoid uuid, userid uuid, name varchar, description varchar, location text, location_type int, preview_thumbnails map<text,text>, tags set<varchar>, metadata set <frozen<video_metadata>>, added_date timestamp, PRIMARY KEY (videoid));

Page 73: Cassandra Day Chicago 2015: Advanced Data Modeling

ThankYou!