Skip to Content
核心概念欄位型別19 種欄位總覽

欄位型別:19 種資料的心智模型

欄位型別同時決定三件事:前端要呈現哪一種輸入控制項、API 接受哪一種 JSON 值,以及資料是直接儲存還是在讀取時推導。先選對型別,之後的驗證、查詢與顯示才不會互相矛盾。

19 種型別地圖

下表是目前後端 ColumnType 的完整集合:19 個值全部列出,沒有省略其他 enum 值interval{start, end} 物件保存一個半開日期時間範圍,json 直接存一份任意 JSON 文件,而三個 principal 型別各內嵌存一個本租戶的身分。現在該用的是 principal:它的 cell 是單一帶標籤的字串——user:<id>smc:<id>room:<id>——所以同一欄可以指向內部使用者、社群客戶,或整個聊天室(成員繼承該指派)。usersocial_client 是較舊的單一種類型別,存的是裸 id。當你需要自己的人員 metadata 時,人員表加 link 仍然是正確模型,但它已經不是表示負責人的唯一方式。

群組型別Cell 形狀儲存與寫入詳細說明
文字string字串存在 record.data,可寫字串與長文
文字text字串存在 record.data,可寫字串與長文
數值integer整數存在 record.data,可寫整數與浮點數
數值float數字存在 record.data,可寫整數與浮點數
邏輯booleantrue / false存在 record.data,可寫布林值
時間dateYYYY-MM-DD 字串存在 record.data,可寫日期與日期時間
時間datetimeYYYY-MM-DD HH:mm 字串存在 record.data,可寫日期與日期時間
時間interval{ "start": "YYYY-MM-DD HH:mm", "end": "YYYY-MM-DD HH:mm" }存在 record.data,可寫區間
選項select一個選項字串存在 record.data,可寫單選與多選
選項multi_select選項字串陣列存在 record.data,可寫單選與多選
檔案attachment附件陣列blob ID 存在 record.data,可寫附件
文件json任意 JSON 值:物件、陣列或純量存在 record.data,可寫JSON
Principalprincipal寫入是帶標籤的 user:<id>smc:<id>room:<id> 字串;讀取是 {ref, kind, id, name, …}存在 record.data,可寫Principal 欄位
Principaluser寫入是 User.id 原始字串;讀取是 {id, name, username, is_deleted}存在 record.data,可寫Principal 欄位
Principalsocial_client寫入是 SocialMediaClient.id 原始字串;讀取是 {id, platform, name}存在 record.data,可寫Principal 欄位
關聯link目標紀錄 ID 陣列存在獨立連結表,可寫連結
推導rollup數字、日期或 null讀取時計算,唯讀彙總
推導lookup純量、陣列或 null讀取時計算,唯讀查找
推導formula數字、布林、字串或 null讀取時計算,唯讀公式

注意 linkrolluplookupformula 都不把 cell 值寫進 record.data:link 值在關聯表,另外三種在讀取時計算。attachment 不屬於計算欄;它會把 blob ID 存在 record.data,讀取時再展開成已遮蔽 URL 的附件資料。intervaljson 與三個 principal 型別都是直接內嵌儲存且可寫,但 principal cell 在讀取時會被轉換:寫進去是身分字串、讀回來是顯示物件,而在本租戶已無法解析的值會維持原始字串。只有 principal cell 讀取時會帶 refkind——usersocial_client 逐位元維持原本的 dict 形狀,前端就是靠這點分辨兩者。

user 指三件不同的事 user 是 ACL 與 IaC 的授權對象種類(grant principal kind)——權限授予給誰。user 同時也是一種欄位型別——紀錄裡的一格。而 user: 還是 principal 欄位裡的一種 cell 標籤。三者只是共用同一個字。

19 種型別的用戶端能力矩陣

這是 schema editor 可直接採用的精簡跨介面模型。「Unique / IaC key」先表示能否成為 unique 規則成分,再表示是否適合當 IaC record natural key

型別值模式REST 查詢篩選REST 排序CSV/XLSX 匯入Unique / 安全 IaC key
stringinline,可寫stored_filters可以字串可以 / 可以
textinline,可寫stored_filters可以字串可以 / 可以
integerinline,可寫stored_filters可以數字字串可以 / 可以
floatinline,可寫stored_filters可以數字字串可以 / 可以
booleaninline,可寫stored_filters可以不行;檔案 cell 仍是字串可以 / 不行
dateinline,可寫stored_filters,含相對日期可以標準日期字串可以 / 可以
datetimeinline,可寫stored_filters,含相對日期可以只接受標準分鐘字串可以 / 可以
intervalinline {start, end} 物件,可寫stored_filtersoverlapscontains_point、presence可以,依 start拒絕;檔案 cell 無法組成物件不行 / 不行
selectinline,可寫stored_filters可以完全相符的 option 字串可以 / 可以
multi_selectinline 陣列,可寫舊版 filters membership;stored_filters encoded-array oddity*目前是 encoded-array oddity*不行;importer 提供字串不行 / 不行
attachmentinline blob-ID 陣列,可寫;讀取時加工只有 presence不行不行;需要 ID 陣列不行 / 不行
jsoninline JSON,可寫只有 whole-cell 純量等值不行拒絕不行 / 不行
principalinline 帶標籤字串,可寫;讀取時加工只有帶標籤 cell 等值不行只接受本租戶帶標籤 cell可以 / 可以
userinline 原始 ID,可寫;讀取時加工只有原始 ID 等值不行只接受本租戶原始 ID可以 / 可以
social_clientinline 原始 ID,可寫;讀取時加工只有原始 ID 等值不行只接受本租戶原始 ID可以 / 可以
link可寫的 relation-ID 陣列,不在 inline datamembership 與 presence不行拒絕只限 cardinality-one / 不行
rollup讀取時計算,唯讀computed_filters有條件的單欄排序†拒絕不行 / 不行
lookup讀取時計算,唯讀只限純量 one/picked lookup†只限純量 one/picked lookup†拒絕不行 / 不行
formula讀取時計算,唯讀computed_filters有條件的單欄排序†拒絕不行 / 不行

* 「包含某個 option」請使用舊版 filters map。後端也接受 multi_select 進入 stored_filters 或當 sort key,但兩條路都比較整個已儲存陣列的 JSON_UNQUOTE 字串形式,不理解個別元素,也不是穩定的產品篩選/排序合約。用戶端不應依賴這兩種 encoded-array 行為。

† 計算欄篩選/排序使用 computed_filters 與單欄 sort_by,不屬於 stored filter 或多欄排序。Lookup 必須呈現單一純量(cardinality-one 或帶 pick 的 many lookup),而且不能帶 eval-only 的 fallback;computed-sort guard 也會拒絕 live rows 超過 50,000 的表。

最後一欄談的是 key,不代表所有規則家族。其他規則各自有 operator 與型別 gates。IaC 請使用具有穩定等值表示的 inline scalar:string/text、數值、date/datetime、select 或 principal。Boolean、JSON 與複合 interval 物件會被明確拒絕;list-valued、relation、attachment 與 derived cell 都不是安全的 record-matching key。各介面的 wire rule 差異見檔案匯入查詢遷移

JSON 與 principal 的特殊能力限制

json 刻意不算已儲存純量,而三種 principal 型別都算。這一個差異就決定了下表大部分內容:

能力jsonprincipaluser / social_client
REST 過濾只能等值、運算元須為純量:eqneqinis_nullis_not_null只能等值,且運算元必須是帶標籤的 cell只能等值、運算元須為原始 id
可排序
REST group_by / metricgroup_by 可以(標籤是鍵的一部分);countcount_distinct 可以group_by 可以;countcount_distinct 可以,sumavgminmax 不行
name_eq / name_contains不行——先解析,再用 ref 過濾可以
Formula 引用
Rollup / lookup 目標可以(lookup 帶出的是原始帶標籤字串可以(lookup 帶出的是原始 id,不是顯示物件)
unique 規則成分可以可以
require 規則可以——但 {}[] 算「有填」可以可以
Upsert 的 match_column可以可以
ACL row policy / SCP 葉節點可以,只能等值——ACL row policy 裡的 $me 解析成一個集合;SCP 葉節點只收 literal可以,只能等值——ACL row policy 裡的 $me 解析成單一 id;SCP 葉節點只收 literal
IaC 自然鍵可以可以
cell 內的 IaC 身分 token$user: / $smc: / $room:——存成帶標籤 cell$user: / $smc:
send_channel_message 收件人social_client 可以,user 不行
invoke_command$row 輸入只能餵 string 參數identity: 參數或 string
CSV/XLSX 匯入目標可以,但來源 cell 必須是屬於本租戶的帶標籤 cell可以,但來源 cell 必須是屬於本租戶的原始身分 ID 字串

這四種型別都一律拒絕 default_valuemax_lengthoptions,也都不接受任何附件或計算欄設定欄位。

建立欄位的共同形狀

對既有表新增欄位,使用 columns.create。每個型別頁的「建立 schema」都只顯示該端點的 JSON body;範圍與 table_id 由路徑提供。

{ "name": "訂單編號", "type": "string", "required": true, "default_value": "待編號", "description": "外部 ERP 的訂單識別碼", "max_length": 32 }

純量欄可以使用 required、型別相符的 default_value,而 max_length 只適用於 string / text。推導欄是唯讀資料,因此不可設 requireddefault_valuemax_lengthintervaljsonprincipalusersocial_client 只接受 requireddescription——在這五種型別上宣告 default_valuemax_lengthoptions,欄位在建立前就會被拒絕。

欄位身分:顯示名稱與內部鍵

建立時送出的 name 是給人看的顯示名稱,例如「訂單編號」。伺服器同時產生穩定的內部鍵,例如 col_c3333333_3333_4333_8333_333333333333,並放進 settings.column_mapping。顯示名稱可以改,內部鍵不變;查詢、更新紀錄與推導欄的持久化引用因此不會因改名失效。完整規則請見欄位身分

選型原則

  • 要讓使用者自由輸入:選 stringtext、數值、布林或日期型別。
  • 要把一組開始/結束日期時間當成單一值移動與驗證:選 interval
  • 要限制在受控字典:選 selectmulti_select
  • 要附加檔案:選 attachment,先上傳 blob,再把 blob ID 寫入 cell。
  • 要原樣保留一份半結構化資料——webhook body、ERP 封包、每列各自的設定——選 json。但要接受它不能排序、不能當鍵值,也不能餵給 formula。
  • 要指向負責人:選 principal。一格可以放 user:<id>smc:<id>room:<id>,所以同一欄能指向同事、客戶的聊天身分,或整個聊天室(成員繼承該指派)。usersocial_client 留給既有的單一種類欄位。三者都是 $me row policy 比對的對象。若你需要的是屬於自己 schema 的人員 metadata,改用人員表加 link
  • 要建立表間關係:先建 link;要顯示目標欄用 lookup,要彙總目標列用 rollup
  • 要用欄位組合出新值:選 formula;它與 lookup 一樣唯讀,但公式是運算,不是單純帶出目標值。

試試看

API Playground 選擇 columns.create,或用連結與彙總流程精靈實際建立跨表欄位。

Last updated on