2016-03-21 5 views
1

私はカッサンドラでMAUとDAUを追跡するために2つのテーブルを使用しています。各テーブルのデザインは同じです:月間アクティブユーザー(MAU)と日常アクティブユーザー(DAU)の作成とクエリのスキーマ?

create table log.MAU(d timestamp, userId varchar, primary key (d, userId)); 

ユーザーがログインするか、セッションを再開するたびにテーブルに挿入します。タイムスタンプについては、それぞれのUTCの「ゼロ時間」(たとえば、DAUの現在の日のUTC深夜、MAUの現在の月の最初の日のUTC深夜)を使用します。

現在のデザインの利点は、シンプルさ(例:select count(*) from DAU where d = ?)とサイズ(ユーザーがアクティブな場合は、1日/月の1つのレコードのみが保持されます)です。

しかし、ローテーション期間(過去24時間のアクティブユーザーなど)はできないし、毎日または毎月の1時間ごとにアクティビティを追跡することもできないという欠点があります。必要なセカンダリインデックスを追加した場合、私がおそらく論争する可能性のある他のcassandraログ)。

私が言及した特定の弱点や私が考慮していないものを考えれば、DAUとMAUの方が良いかどうかについての考えはありますか?ポストグルのような別のDBがもっと適切だろうか?ありがとう!

答えて

2

もう少し正確ではない日付列をキー入力することでこれを解決できると思います。

CREATE TABLE mau(
    month bigint, 
    d timestamp, 
    userid text, 
    PRIMARY KEY (month,d,userId)); 

は、その後、あなたが特定の月を照会できます:

毎月のユーザーのために、このような何かがうまくいく

SELECT d, userid FROM may WHERE month=201603; 

そして、あなたはまた、範囲を照会することができます:

SELECT d, userid FROM mau WHERE month=201603 
    AND d>'2016-03-21 19:40:00+0000' AND d<'2016-03-21 19:50:00+0000'; 

d      | userid 
--------------------------+-------- 
2016-03-21 19:40:13+0000 | tron 
2016-03-21 19:40:20+0000 | yori 
2016-03-21 19:40:28+0000 | quorra 
2016-03-21 19:40:36+0000 | paige 

(4 rows) 

monthがあなたに適しているかどうかは、予想される行の数によって異なります1カ月あたりのヒット数、そしてそれがカサンドラのパーティションあたりの20億セルの限界に近づくことになるでしょう。念頭に置いて、それはこのように、またdayによって分割する、おそらく良いアイデアだとベアリング:もちろん

CREATE TABLE mau(
    month bigint, 
    day bigint, 
    d timestamp, 
    userid text, 
    PRIMARY KEY ((month,day),d,userId)); 

、あなたは一度に月全体照会することができないであろう。しかし、そのアプローチを使いこなし、アプリケーションに適したPRIMARY KEY戦略が見つかるかどうかを確認してください。

EDIT 20160323

だから、 "ユニーク" ログインをカウントするために、私は、 "SELECT COUNT(*)の個別のuserId" またはsomesuchを行う必要があります。私はCassandraの独特のものに深く慣れていませんが、私はそれがパーティションキーで動作することを知っています。このスキーマのパーティションキーが3つの列(月、d、userId)の組み合わせであるとすれば、userIdだけで別個にカウントされますか?

いいえ、countは、iteslfのuseridでは機能しません。まず、PRIMARY KEYコンポーネントをスキップすることはできません。第二に、カサンドラでは、クエリベースのモデリング手法をとる必要があります。ログインしていた別個のユーザーIDを照会する必要がある場合は、それをサポートするために新しい表を作成する必要があります。もたらすであろう

SELECT * FROM logins_by_user ; 

userid | d 
--------+-------------------------- 
quorra | 2016-03-21 19:40:28+0000 
    paige | 2016-03-21 19:40:36+0000 
    tron | 2016-03-22 19:37:53+0000 
    tron | 2016-03-21 19:40:13+0000 
    yori | 2016-03-21 19:40:20+0000 

(5 rows) 

ユニークユーザーIDの問い合わせ:

CREATE TABLE logins_by_user (
    userid text, 
    d timestamp, 
    PRIMARY KEY(userid,d)) 
WITH CLUSTERING ORDER BY (d DESC); 

のは、私が二度目の中に、そのユーザー「トロン」のログを除いて、上記と同じデータを持っているとしましょう

SELECT DISTINCT userid FROM logins_by_user ; 

userid 
-------- 
quorra 
    paige 
    tron 
    yori 

(4 rows) 

これがまさにあなたが探しているものであるかどうかはわかりませんが、そのアイデアがあなたを正しい方向に導いてくれることを願っています。

+0

"ユニークな"ログインをカウントするには、 "select count(*)distinct userId"などを実行する必要があります。私はCassandraの独特のものに深く慣れていませんが、私はそれがパーティションキーで動作することを知っています。このスキーマのパーティションキーが3つの列(月、d、userId)の組み合わせであるとすれば、userIdだけで別個にカウントされますか?ありがとう! – Adam

+0

@Adam Edit made。 – Aaron

関連する問題