案例在一个软件包中我有一个为患者执行激活的课程&医生
患者细节操作(post
,get
,put
,delete
)由Patient
控制器完成,
医生特定操作(post
,get
,put
,delete
)由Doctor
控制器
有:
患者Z咨询医生A,B& d。
问题:如果在删除患者后,将其从每位出诊的医生处取出,并在取消医生后将其从接受治疗的患者身上移除?
答案 0 :(得分:0)
如果我正确理解您的用例,这就是您想要做的事情
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架构时记住目标。
第一个目标 - 了解您的查询数据
第二个目标 - 尝试在群集中分发数据
第三个目标 - 最小化分区读取次数。
我们的询问是 -
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参加的病人名单
从VISITS_BY_DOCTOR中选择*,其中Doctor_name = A;
从VISITS_BY_DOCTOR中删除,其中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).
这将满足“跨群集传播数据”的目标。此外,它还可用于根据访问日期获取历史记录。