2017-07-01 85 views

回答

1

有關係建模的氣味:)。卡桑德拉沒有加入。提示:保持非規範化以適應查詢。

在Cassandra中,數據模型應該適合訪問模式,並且可以在數據模型複製時複製數據。所以我們不需要將兩個表格設計連接起來,而是使用兩個表格設計來服務不同的查詢模式。

比方說

訪問模式1:給出爲person_id找到他/她的詳細內容部門詳細信息。創建下表以服務該用例

CREATE TABLE department_by_person (person_id int, first_name text, last_name text, dept_id int , PRIMARY KEY (person_id, dept_id)); 

現在有了爲person_id將得到他的所有細節的查詢請求,包括部門標識。

select * from department_by_person where person_id = ? 

訪問模式2:給出的dept_id找到他/她的詳細內容的人的詳細信息。您可以在另一臺由分區鍵來服務這個用例被DEPT_ID

CREATE TABLE person_by_department (person_id int, first_name text, last_name text, dept_id int , PRIMARY KEY (dept_id, person_id)); 

現在用的dept_id查詢將得到所有他/她的細節要求,包括爲person_id。但請記住,還需要額外的編碼才能使這兩個表保持同步,而這只是根據訪問模式進行復制而已。

select * from person_by_department where dept_id = ? 

或者你可以創建一個物化視圖,而不是第二個表,然後卡桑德拉將保持MV同步與表。換句話說,在這裏不需要額外的應用程序工作來保持同步。

create materialized view mv_person_by_department as 
select person_id, first_name, last_name, dept_id 
from department_by_person 
where person_id is not null 
and dept_id is not null 
primary key (dept_id, person_id); 

現在用的dept_id查詢將得到所有他/她的細節要求,包括爲person_id。

select * from mv_person_by_department where dept_id = ? 
+0

感謝您的回覆。因此,爲了獲得這種類型的數據,我總是需要創建另一個表並將數據(我需要從給定的表中)插入到它中? –

+0

作爲替代方案,我向您提供了物化視圖選項,以及您無需爲其他表格進行管理/編碼的情況。您需要根據查詢模式開始建模。因此,根據需要解決的查詢來設計表格。 – dilsingi

+0

是的,但MV只會給我人名錶中的名字,姓氏,dept_id,而我希望整個部門名稱位於另一個名爲department的表中。例如。 dept_id是'ET',因此這個id的完整部門名稱是'Education and Training'。我想要全名。 –

相關問題