2017-07-31 66 views
0

我正在使用Cassandra作爲數據存儲的服務。我目前正在實施停止服務,其中將包含停靠點列表(乘客可以登上車輛的交通站點,例如公交車)。保持cassandra表格投影同步更新

我需要支持以下情況:

  1. 獲取停止編號
  2. 獲得由公司ID和代碼升序排序機構ID,名稱ASC渾身解數

下面是我實施我的表來支持:

CREATE TABLE IF NOT EXISTS stops(
    id      uuid, 
    client_id     uuid, 
    agency_id     uuid, 
    code      varchar, 
    name      varchar, 
    latitude     double, 
    longitude     double, 
    is_wheelchair_accessible boolean, PRIMARY KEY (id) 
); 

CREATE TABLE IF NOT EXISTS stops_by_client_id(
    client_id     uuid, 
    agency_id     uuid, 
    code      varchar, 
    name      varchar, 
    id      uuid, 
    latitude     double, 
    longitude     double, 
    is_wheelchair_accessible boolean, 
    PRIMARY KEY ((client_id, agency_id), code, name, id) 
); 

問題:

這個效果很好,當我插入數據並閱讀它時。當我需要更新一站式出現該問題:

  1. 更新停止,並設置新的代碼,名稱,經緯度等
  2. 更新上stops表是沒有問題的,但我沒能採用同樣的更改stops_by_client_id投影。

我試過到目前爲止:

  1. 我試圖更新由CLIENT_ID,agency_id和id行,但它需要通過所有的主鍵值(CLIENT_ID,agency_id,代碼,姓名,身份證),但在我的StopUpdated事件(我觸發更新)中,我沒有以前的代碼和名稱值,我可以使用它來構造這樣的查詢。
  2. 我想先刪除行,然後插入新的(模擬更新),但它失敗出於同樣的原因爲1
  3. 我試圖構建主鍵如下PRIMARY KEY ((client_id, agency_id, id), code, name)但這把每行它是自己的分區,這將使選擇查詢非常低效。
  4. 我不能使用物化視圖,因爲我需要一些字段的二級索引(例如代碼,is_wheelchair_accessible),所以我可以過濾它們。

關於如何解決這種情況的任何想法?

+0

一個表可以同時具有物化視圖和二級索引,所以4)仍然是一個選項。 –

回答

0

獲取您要使用ID更新的行的client_id和agency_id以及其他組合鍵的現有值,並使用這些值刪除stops_by_client_id中的行。

stops表中更新該行後,必須從該表中獲取該ID的其他列的值,並在stops_by_client_id表中創建一個新行。

希望這是你在找什麼。

+0

對這些表的更新是同步的,但是在我的情況下,這些表的更新是以異步方式完成的,因爲寫入它們的處理器接收異步事件(StopUpdated)。我忘了在我的問題中提到這一點。謝謝@ b1k尋求幫助。 –

1

最後我改變了我的架構並修改了StopUpdate事件以包含舊狀態和新狀態(更新前後)。這樣我有所有需要的信息來組裝查詢。