如果我正确理解你的使用情况,这是你想要做
医生一出席患者的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。?;因为它错过了关键钥匙 –