我是新來的卡桑德拉和正在尋找如何有這種一般結構如下數據模型中的最佳實踐:最佳實踐模型數據的數據庫
的數據是基於「用戶」(每用戶) ,每個提供大約500K-2M條目的大數據文件(每天定期更新幾次 - 有時全部更新,有時只增量)
每個數據文件都有一定的強制性數據字段(~20強制),但可以根據他們的判斷增加額外的欄目(最多〜100)。
的附加數據字段是NOT必然同爲不同用戶(字段的名稱或類型的那些字段的)
實施例(CSV格式:)
user_id_1.csv
| column1 (unique key per user_id) | column2 | column3 | ... | column10 | additionalColumn1 | ...additionalColumn_n |
|-----------------------------------|-----------|----------|---------|------------|---------------------|------------------------|
| user_id_1_key_1 | value | value | value | value | ... | value |
| user_id_1_key_2 | .... | .... | .... | .... | ... | ... |
| .... | ... | ... | ... | ... | ... | ... |
| user_id_1_key_2Million | .... | .... | .... | .... | ... | ... |
user_id_XXX.csv (notice that the first 10 columns are identical to the other users but the additional columns are different - both the names and their types)
| column1 (unique key per user_id) | column2 | column3 | ... | column10 | additionalColumn1 (different types than user_id_1 and others) | ...additional_column_x |
|-----------------------------------------------------------|-----------|----------|---------|------------|-----------------------------------------------------------------|-------------------------|
| user_id_XXX_key_1 | value | value | value | value | ... | value |
| user_id_XXX_key_2 | .... | .... | .... | .... | ... | ... |
| .... | ... | ... | ... | ... | ... | ... |
| user_id_XXX_key_500_thousand (less rows than other user) | .... | .... | .... | .... | ... | ... |
我考慮過的幾個選項:
選項1:
- 創建一個「全球性的」密鑰空間
- 創建一個大表「數據」包含一切
連接一個user_id列於所有其他列的大表(包括非強制性列)。主鍵變成USER_ID + 「COLUMN_1」(COLUMN_1爲每USER_ID唯一的)
Keyspace +--------------------------------------------------------------------------+ | | | | | Data_Table | | + +--------+-------+--------------------------+-----+ | | | | | | | | | | | +-------------------------------------------------+ | | | | | | | | | | many rows | +-------------------------------------------------+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Many columns | | | | | | | +------------------------> | | | | | | | | | | | | | +-------------------------------------------------+ | | v +-------------------------------------------------+ | | | +--------------------------------------------------------------------------+
,我注意到馬上有幾件事情:
- user_ID的自身重複多次的條目每用戶
- 對於其他列(空值爲空值 值),行非常稀疏,因爲用戶不一定共享它們
- 用戶數rel atively小,所以許多附加列 的不是很大(10K列最大值)
- 我可以每用戶的附加列中的數據壓縮到名爲「元數據」一列,佔所有用戶
分享
選項2:
每密鑰空間
每USER_IDCREATE TABLE 「數據」 創建密鑰空間個
+-----------------------------------------------------------------------------------+
| column_1 | column_2 | ... | column_n | additional_column_1 | additional_column_n |
+-----------------------------------------------------------------------------------+
keyspace_user1 keyspace_user2 keyspace_user_n
+----------------+ +---------------+ +---------------+
| | | | | |
| | | | | |
| +-+-+--+-+ | | +-+--+--+ | | +--+--+---+ |
| | | | | | | | | | | | | many keyspaces | | | | | |
| | | | | | | | | | | | | +-------------> | | | | | |
| | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | |
| +--------+ | | +-------+ | | +---------+ |
+----------------+ +---------------+ +---------------+
筆記:
- 許多keyspaces(每用戶密鑰空間)
- 避免了增加每每一行 「USER_ID」 值(我可以使用密鑰空間名稱作爲用戶ID)
- 非常每密鑰空間幾個表(在這個例子中僅每密鑰空間1個表)
選項3:
1)創建一個全局密鑰空間 2)創建每USER_ID的表(強制性列以及每其表及其附加列)
+---------------------------------------------------------------+
| Keyspace |
| |
| user_1 user_2 user_n |
| +--+---+--+ +--+--+--+ +--+--+--+ |
| | | | | | | | | | | | | |
| | | | | | | | | | | | | |
| | | | | | | | | | | | | |
| | | | | | | | | | | | | |
| | | | | | | | | | | | | |
| +--+---+--+ +--+--+--+ +--+--+--+ |
| |
| |
+---------------------------------------------------------------+
注
- 全局按鍵空間
- 每個user_id的表(「許多」表)
- 避免重複用戶標識每行
方案四:(這是否有道理?)
創建多個keyspaces(keyspaces的例如 「×」 號)各保持一個範圍的表(每個用戶臺)
keyspace_1 keyspace_x
+---------------------------------------------------------------+ +---------------------------------------------------------------+
| | | |
| | | |
| user_1 user_2 user_n/x | | user_n-x user_n-x+1 user_n |
| +--+---+--+ +--+--+--+ +--+--+--+ | | +--+------+ +--+--+--+ +--+--+--+ |
| | | | | | | | | | | | | | "X" keyspaces | | | | | | | | | | | | | |
| | | | | | | | | | | | | | +---------------------> | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | |
| +--+---+--+ +--+--+--+ +--+--+--+ | | +--+---+--+ +--+--+--+ +--+--+--+ |
| | | |
| | | |
+---------------------------------------------------------------+ +---------------------------------------------------------------+
注:
- 多keyspaces
- 每個用戶多個表
- 需要「查找」來確定哪個鍵空間包含所需的表
選項5:
分割數據,以多個表和多個keyspaces
注: 1.需要在某些情況下 2.好像是 「加入」 從多個表中的信息更復雜
一般n所有場景OTES:
- 有一個幅度較小的寫入速度比讀取
- 數以百萬計的每天讀取每USER_ID
- 流量有波動 - 一些user_ids有大量的流量和一些user_ids有少得多交通。需要調整按照該指標
- 一些user_ids被更新(寫)的頻率高於其他
- 我們擁有跨地域的多個數據中心,並應同步
- 沒有每個主鍵的長尾巴(有些鍵訪問許多次,而其他按鍵都很少被訪問)
我是cassandra自己的新手,但選項1對我最有意義。卡桑德拉是爲稀疏列建造的。另外,看看複合主鍵 - PRIMARY KEY(key_part_one,key_part_two)。看看這裏:https://stackoverflow.com/a/24953331/1277048。這爲連接方法的檢索提供了一些靈活性:您可以在一個請求中讀取所有包含key_part_one的行,或者只讀取與(key_part_one,key_part_two)匹配的行。 – FuzzyAmi
列出所有您選擇的查詢,然後根據您的查詢設計您的數據模型。 –