如果我正確理解你的使用情況,這是你想要做
醫生一出席患者的X,Y,Z ...什麼
醫生B出席患者的X,Y,Z ...
醫生Ç出席患者x,y,k ...(醫生C沒有出席患者z)。
D醫生出席了患者x,y,z ...
現在,您正在尋找由醫生A出席的患者列表,並且您從此列表中刪除了患者z。因此,患者z應該從B和D醫生的名單中刪除。您想要爲Cassandra數據庫建模。
我們需要在建模Cassandra模式時記住目標。
第一個目標 - 瞭解您的查詢數據。
第二個目標 - 嘗試在整個羣集中分配數據。
第三個目標 - 最小化分區讀取次數。
我們的疑問是 -
1 - 獲取由醫生(B,C,d)出席了所有患者。
2 - 刪除患者病史(從任何列表中)。
讓我們給一個嘗試 -
CREATE TABLE VISITS_BY_DOCTOR(
Doctor_name text ,
Patient_name text ,
.
.
.
Other columns
PRIMARY KEY (Doctor_name, Patient_name )
)
這將滿足我們的兩個目標。第一個目標,在一個查詢中,我們可以得到醫生A出席的病人名單。
從VISITS_BY_DOCTOR中選擇*其中Doctor_name = A;
從VISITS_BY_DOCTOR中刪除where patient_name = z;
第二個目標,它還最大限度地減少了分區讀取次數,因爲我們可以根據分區鍵「doctor_name」獲取數據。但是這種設計不能滿足第三個目標,在整個集羣中傳播數據。所以讓我們改進它。
CREATE TABLE VISITS_BY_DOCTOR(
Doctor_name text ,
Patient_name text ,
Visit_date bigint,
.
Other columns
PRIMARY KEY ((Doctor_name, Patient_name), Visit_date )
) WITH CLUSTERING ORDER BY (Visit_date DESC).
這將滿足目標「跨集羣擴展數據」。也可以根據訪問日期來獲取歷史記錄。
我猜這甚至可以跨集羣((PRIMARY KEY(Doctor_name,Patient_name)),即傳播數據,而無需添加VISIT_DATE,你是否同意 –
此外,你不能這樣做從VISITS_BY_DOCTOR這個刪除其中patient_name = Z。?;因爲它錯過了關鍵鑰匙 –