2017-03-06 39 views
2

Folks, 我想用Cassandra中的一張表解決以下問題。所述服務追蹤用戶何時打開資產。在隨後對同一資產發生的事件中,我們只需覆蓋accessDate。Cassandra Schema用於檢索日期定購的記錄

例如記錄:

{用戶名: 「串」,由assetid: 「串」,accessDate:unixTimestamp}

與此說,我們需要滿足下列訪問要求(每要求有自己的可讀性要點):

  • 能夠返回用戶已打開以及在什麼時間的所有資產。

這是很容易實現的,表可能看起來像:

CREATE TABLE user_assets_tracker (
    userId uuid, 
    accessDate timestamp, 
    assetId uuid, 
    PRIMARY KEY (userid, accessDate, assetId) 
); 

這使我們能夠查詢所有資產,並在每個最後一次訪問。

SELECT * 
FROM user_assets_tracker 
WHERE userId = 522b1fe2-2e36-4cef-a667-cd4237d08b89 
ORDER BY accessDate DESC; 
> 

丹迪。現在,我不確定的難點在於希望你們鄉親能夠加入:

  • 讓我看看過去30天內添加的所有資產。

當然,LIMIT這裏並不是我們所需要的。另外,我們可能需要2個表來實現這一點。

SELECT * 
FROM user_assets_tracker 
WHERE userid = 522b1fe2-2e36-4cef-a667-cd4237d08b89 
ORDER BY accessDate DESC; 
LIMIT 10; ????? 
  • 告訴我該用戶的最後訪問項目。我認爲這個更容易,LIMIT 1解決了這個問題。

這可能是直線前進,用這個模式:

CREATE TABLE user_assets_tracker (
    userId uuid, 
    accessDate timestamp, 
    assetId uuid, 
    PRIMARY KEY (userid, accessDate, assetId) 
); 

SELECT * 
FROM user_assets_tracker 
WHERE userid = 522b1fe2-2e36-4cef-a667-cd4237d08b89 
ORDER BY accessDate DESC; 
LIMIT 1; 
  • 檢索完整記錄特定的用戶id +由assetid

由於accessDate在我們的模式來由assetid之前,我不知道如何做到這一點。另一張桌子?

謝謝!

PS似乎SASI Index可能是解決

回答

2

雖然你總是選擇由assetid排序依據accessDate遞減。
通過accessDate遞減

CREATE TABLE user_assets_tracker (
    userid uuid, 
    accessdate timestamp, 
    assetid uuid, 
    PRIMARY KEY (userid, accessdate, assetid) 
) WITH CLUSTERING ORDER BY (accessdate DESC, assetid ASC); 

現在你不需要通過accessDate遞減每次都指定順序定義與順序架構。它會在默認情況下通過accessDate desc

  • 顯示過去30天內添加的所有資產。

首先獲取30天前的時間戳。
讓目前的30天前的時間戳是:2017-02-05 12:00:00+0000
現在你可以查詢:

SELECT * FROM user_assets_tracker WHERE userid = 522b1fe2-2e36-4cef-a667-cd4237d08b89 AND accessdate >= '2017-02-05 12:00:00+0000' 
  • 檢索完整記錄特定的用戶id +由assetid

如果您使用的卡珊德拉3.0或以上,您可以使用Materialized Views
創建物化視圖:

CREATE MATERIALIZED VIEW user_assets AS 
    SELECT * 
    FROM user_assets_tracker 
    WHERE userid IS NOT NULL AND assetid IS NOT NULL AND accessdate IS NOT NULL 
    PRIMARY KEY (userid, assetid, accessdate); 

現在,如果你想獲得與用戶名和由assetid所有數據,這裏是查詢

SELECT * FROM user_assets WHERE userid = 522b1fe2-2e36-4cef-a667-cd4237d08b89 AND assetid = 1d45e6c2-02a1-11e7-aac5-b9ab92bee74c; 

這裏是另一回事,如果巨大的數據插入到一個單一的用戶,你應該添加時間桶的用戶ID作爲分區鍵。更多檢查答案https://stackoverflow.com/a/41857183/2320144

+0

非常感謝你!快速的問題,我看到在第一個例子中(userid,accessdate,assetid),但在第二個例子中(userid,assetid,accessdate); 單個查詢如何工作? – Cmag