2016-11-13 42 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。?;因为它错过了关键钥匙 –