iT邦幫忙

2023 iThome 鐵人賽

DAY 21
0
AI & Data

dbt: 告別過時的SQL開發流程系列 第 21

DAY 21 - dbt 中階 (8) - 專案架構及命名原則

  • 分享至 

  • xImage
  •  

如同軟體開發領域,Best Practices 雖是多數人所認同的大方向,但卻非適用所有情境,且隨時在進化,沒有永久適用的通則。

今天我想分享的是我從使用 dbt 以來,從官方的建議作法出發,加入在 Teamson 導入 dbt 的考量後,在我個人腦中所塑造出來,但卻尚未定型的 dbt 專案架構及命名原則。

相信大家在導入 dbt 時,也能發展出一套屬於自己的 Best Practices Guide。


通用命名原則

  • 檔名全小寫,以下底線 _ 分隔的 snake_case
  • 避免只有少數人才懂的縮寫。 舉例:能放 google_analytics 就不要放 ga,過多的縮寫會提高進入門檻,不利於團隊合作。
  • 善用雙底線,提高可讀性。 承上,將命名放入完整資訊能幫助理解,但一長串底線分隔的字仍然需要一點力氣看懂。這時可利用雙底線,幫助斷句。

seeds 的資料夾架構及命名原則

  • 資料夾結構:依系統(資料來源)分資料夾
  • seed 名稱:seed_[xxxx] 我們目前只有開頭用 seed_,暫無其他規範。

macros 的資料夾架構及命名原則

  • 一個檔案可以放多個 macro,但我喜歡一個檔案只放一個 macro,且檔名與 macro 名稱相同,方便查看。
  • 我習慣將自己開發的 macro 名稱加上 tmsn_ 的前綴,代表是由 teamson 自行開發的。如此一來在文件中能一眼就和 dbt 內建或由 packages 來的 macro 有所區隔。

models 的三層架構

DAY 05 我們拆出了簡易的架構:source -> staging -> final output,現在要進一步介紹 dbt 建議的三層架構:staging -> intermediate -> marts。

Staging: 由資料來源的第一步準備工作

  • 資料夾結構:對齊資料來源。
  • yaml:一個資料來源使用一個 yaml 檔。
  • model 名稱:stg_[source]__[table_name],使用雙底線區分資料源及 table 名稱。此處的 table name 我傾向對齊資料來源,因此如果原始 table 名稱是大寫,這裡我也會使用大寫,此為 snake_case 的一個例外。
  • Materialization: views
  • 一個 source 對應一個 staging model,為一對一的關係。
  • 我們 SAP 的資料來源為同樣的 table。一模一樣的 table 名稱,類似的欄位,出現在多個 schema。為了方便使用,我們在 staging 把這些 table union all 合併起來,避免後續重複的 transformation 要做很多次。

Intermediate: 開始加入商業邏輯

  • 資料夾結構介於 staging 和 marts 的區分方式,尚無固定規則。
  • model 名稱:int_[entity]s_[verb]s.sql
  • Materialization: views (也有試過在這一步做 incremental 但後來移到 marts 了)
  • 開始大量的商業邏輯轉換
    • 欄位 renaming
    • Join table
    • 欄位型態轉換
    • 加衍生欄位

Marts: 最終要輸出的結果都放在這一層

  • 資料夾結構:對齊商業目的
  • Materialization:tables 或 incremental models
  • 不放代表資料類型 fact 或 dimension 的 fct_ / dim_ 或是 f_ / d_ 前綴,model 名稱盡量用低技術門檻的詞彙。
  • 謹慎考量運算資源及更新時間。
  • 我們最後有再多一層: exposures,我們把最終要呈現出來的資料 materialize 成 table 之後,再多做成 views 給終端使用者。其中一個原因是我們在這個 exposure 層處理不同的 custom schema, alias, 和 user 權限。另一個考量是,如果同樣的資料源,要長成多個 exposure,做成 view 能避免重複跑多個一樣的 table,耗費運算資源及時間。

今日小結&明日預告

今日談到的資料夾的拆分,除了方便檢索之外,也和明天的主題排程規劃,有一些關聯。

明天的主題:排程規劃以及 Tags

參考資料


歡迎加入 dbt community
對 dbt 或 data 有興趣 👋?歡迎加入 dbt community 到 #local-taipei 找我們,也有實體 Meetup 請到 dbt Taipei Meetup 報名參加


上一篇
DAY 20 - dbt 中階 (7) - Exposures 及 Custom Outputs
下一篇
DAY 22 - dbt 中階 (9) - 排程規劃 & Tags
系列文
dbt: 告別過時的SQL開發流程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言