搜尋

首頁  >  問答  >  主體

REST 设计困惑?Mysql 是直接存字符串好还是数字好?

现在正在做 REST API 的设计,在设计过程中遇到了一些困惑,问题是这样的:

比如我有一个订单表

order_id products status
1 笔记本电脑 canceled
2 华为手机 finished
3 小米手环 delivering

获取所有订单的接口设计如下,其中有一个可选参数是 status 可选值为 canceledfinisheddelivering

GET /order?status=canceled //已取消的订单

GET /order?status=finished//已结束的订单

GET /order?status=delivering //配送中的订单

这样设计API,可读性还是很好的。但对这里的 status 字段有一些疑问,该字段在数据库中,是直接存储为字符串?还是存储为数字?

由于需要保证API可读性好,所以如果用 数字来存储 status ,那么就需要管理字符串与数字之间的对应关系。

比如说:canceled => 0finished => 1, delivering => 2

但是这样子,就需要在程序上,对status做一些转换,会无形增加一些程序的复杂性。

我的问题是:能不能直接把 status 字段直接存储为字符型?,就像上面的设计一样。如果数据量大会不会造成性能问题?或者其他一些问题? 谢谢!

伊谢尔伦伊谢尔伦2777 天前3810

全部回覆(16)我來回復

  • PHP中文网

    PHP中文网2017-04-17 13:18:30

    我現在是覺得存字串比較好。
    如果存的是數字,根據你的業務流程下來,存0,1,2,3,4,5等代表不同狀態,前期這麼定義是沒問題的。
    但是如果業務流程改變了,需要在4,5兩個狀態間增加兩個個新狀態,那麼就是要新增一個狀態6 ,7。
    其實你的流程狀態是0,1,2,3,4,6,7,5,我看著變扭。

    這裡使用字串就不存在這個問題了。

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 13:18:30

    我是存tinyint ,然後在程式中用一個公共方法做映射

    回覆
    0
  • 阿神

    阿神2017-04-17 13:18:30

    我建議存int比存string從各方面(除了你說的轉換)來說都會好很多。

    然後是轉換的問題的,其實這不是個問題,所有和db接觸之前的操作對於這些都可以使用你業務的名詞(canceled,finished, delivering),只有當和db接觸時才會轉成對應的數字,其實轉換的部分只寫在一個地方就好了(比如這個部分就時java 設計模式中的dao層),當然為了便於之後名詞的修改或者是統一每個人的拼寫(大小寫?)名詞也要定義成常數。

    回覆
    0
  • 大家讲道理

    大家讲道理2017-04-17 13:18:30

    我才不會告訴你淘寶存的是字符串

    回覆
    0
  • 大家讲道理

    大家讲道理2017-04-17 13:18:30

    存字串的話,某天有人寫程式碼的時候,不小心寫了 DELlVERING(l 是小寫,看出來沒?) 之類的,你就蛋疼了。

    一般我的編碼習慣是,「別相信別人不會犯錯,別相信自己不會犯錯,給最小的選擇。」

    回覆
    0
  • 大家讲道理

    大家讲道理2017-04-17 13:18:30

    存字串是作死。

    可讀性可以在程式碼中用常數或是枚舉取代硬編碼。

    回覆
    0
  • 取消回覆