Case:在一个包中,我有一个为患者执行活动的类&医生
-
患者特定操作(
post
,get
,put
,delete
)由Patient
控制器完成, -
医生特定操作(
post
,get
,put
,delete
)由Doctor
控制器完成
有:
- 4位医生:A、B、C、D;
- 50例患者-其中1例患者的名字为Z
- 一个医生有多个病人
- 一名患者可咨询多名医生
病人Z向医生A、B和;d .
问题:如何在删除"patient"后将其从他所诊治的每个医生中删除,在删除"doctor"后将其从曾诊治过他的患者中删除?
如果我正确理解了你的用例,这就是你想要做的
A医生治疗了x, y, z…
医生B接待了病人x, y, z…
医生C治疗了病人x, y, k…(医生C没有治疗病人z)。
D医生诊治过x, y, z…
现在您正在查看医生A所就诊的患者列表,您从该列表中删除了患者z。因此,患者z应该从医生B和d的列表中删除。您需要为Cassandra数据库建模数据。
我们需要在建模Cassandra schema时记住目标。
第一个目标-了解您的查询数据。
第二个目标-尝试跨集群分布数据。
第三个目标-最小化分区读取的数量。
我们的查询将是-
1 -让所有的病人都由医生A (B,C,D)诊治。
2 -删除病史(从任何列表中)。
让我们试一试-
CREATE TABLE VISITS_BY_DOCTOR(
Doctor_name text ,
Patient_name text ,
.
.
.
Other columns
PRIMARY KEY (Doctor_name, Patient_name )
)
这将满足我们的两个目标。第一个目标,在一个查询中,我们可以获得a医生就诊的患者列表。
Select * from VISITS_BY_DOCTOR where Doctor_name = A;
Delete from 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).
这将满足"跨集群传播数据"的目标。它也可以用来获取基于访问日期的历史。