现在正在做 REST API 的设计,在设计过程中遇到了一些困惑,问题是这样的:
比如我有一个订单表
order_id | products | status |
---|---|---|
1 | 笔记本电脑 | canceled |
2 | 华为手机 | finished |
3 | 小米手环 | delivering |
获取所有订单的接口设计如下,其中有一个可选参数是 status
可选值为 canceled
、finished
、delivering
。
GET /order?status=canceled //已取消的订单
GET /order?status=finished//已结束的订单
GET /order?status=delivering //配送中的订单
这样设计API,可读性还是很好的。但对这里的 status 字段有一些疑问,该字段在数据库中,是直接存储为字符串?还是存储为数字?
由于需要保证API可读性好,所以如果用 数字来存储 status ,那么就需要管理字符串与数字之间的对应关系。
比如说:canceled => 0
、finished => 1
, delivering => 2
但是这样子,就需要在程序上,对status做一些转换,会无形增加一些程序的复杂性。
我的问题是:能不能直接把 status
字段直接存储为字符型?,就像上面的设计一样。如果数据量大会不会造成性能问题?或者其他一些问题? 谢谢!
我現在是覺得存字串比較好。
如果存的是數字,根據你的業務流程下來,存0,1,2,3,4,5等代表不同狀態,前期這麼定義是沒問題的。
但是如果業務流程改變了,需要在4,5兩個狀態間增加兩個個新狀態,那麼就是要新增一個狀態6 ,7。
其實你的流程狀態是0,1,2,3,4,6,7,5,我看著變扭。
這裡使用字串就不存在這個問題了。
我是存tinyint ,然後在程式中用一個公共方法做映射
我建議存int比存string從各方面(除了你說的轉換)來說都會好很多。
然後是轉換的問題的,其實這不是個問題,所有和db接觸之前的操作對於這些都可以使用你業務的名詞(canceled,finished, delivering),只有當和db接觸時才會轉成對應的數字,其實轉換的部分只寫在一個地方就好了(比如這個部分就時java 設計模式中的dao層),當然為了便於之後名詞的修改或者是統一每個人的拼寫(大小寫?)名詞也要定義成常數。
我才不會告訴你淘寶存的是字符串
存字串的話,某天有人寫程式碼的時候,不小心寫了 DELlVERING(l 是小寫,看出來沒?) 之類的,你就蛋疼了。
一般我的編碼習慣是,「別相信別人不會犯錯,別相信自己不會犯錯,給最小的選擇。」
存字串是作死。
可讀性可以在程式碼中用常數或是枚舉取代硬編碼。