ホームページ  >  に質問  >  本文

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 字段直接存储为字符型?,就像上面的设计一样。如果数据量大会不会造成性能问题?或者其他一些问题? 谢谢!

伊谢尔伦伊谢尔伦2741日前3745

全員に返信(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
  • キャンセル返事