2016-11-13 79 views
-1

案例:在包我有執行activirt患者&醫生一類如何同時刪除記錄?

  • 患者specifict操作(postgetputdelete)由Patient控制器完成,

  • 醫生專項操作(post,get,put,delete)由Doctor控制器完成

有:

  • 4醫生:A,B,C和d;
  • 50例 - 與名稱從Z其中之一
  • 一個醫生有多個患者
  • 一個患者可以諮詢醫生多

患者ž諮詢醫生A,B & D.

問題:如何刪除患者後,將其從每位他出席的醫生中刪除,並在刪除醫生後將其從患者中移除?

回答

0

如果我正確理解你的使用情況,這是你想要做

醫生一出席患者的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). 

這將滿足目標「跨集羣擴展數據」。也可以根據訪問日期來獲取歷史記錄。

+0

我猜這甚至可以跨集羣((PRIMARY KEY(Doctor_name,Patient_name)),即傳播數據,而無需添加VISIT_DATE,你是否同意 –

+0

此外,你不能這樣做從VISITS_BY_DOCTOR這個刪除其中patient_name = Z。?;因爲它錯過了關鍵鑰匙 –