我习惯将“type”值存储为整数标识符,并在客户端中使用枚举来标识来自服务器的数据.
举个例子:
在数据库表上:
怪物表:MonsterId(int),名称(字符串),MonsterType(int)
在客户端代码上:
typedef enum { MonsterTypeGround = 1,MonsterTypeAquatic = 2,MonsterTypeAmphibIoUs = 3,MonsterTypeAerial = 4 }MonsterType;
请注意,上面的代码是Objective-C,我可以在其中指定整数值.但我也在使用C#和C.
但是,我们的数据库人说,枚举是一个编译技巧,没有枚举数据类型.他认为整数类型标识符使得人们(其他开发人员)很难理解值的含义,并且他们不可能在不查看客户端代码的情况下知道等价物并且枚举不好因为你需要确保枚举与服务器端ID同步,并且最好使用字符串.
我的问题是:对此事有客观正确的答案吗?
解决方法
你的数据库人显然是错的.当然,如果像ENUM数据类型那样.您在示例中提供了一个. MysqL知道它.许多编程语言都有类似ENUM的东西.
但他也是对的,因为ENUM通常(总是?)由编译器优化.如果有四个选项可以完美地用1到4表示,但我们碰巧发现可识别的字符串更容易在代码中读取.但编译器没有这样的问题,实际上并不关心这个数字.空中怪物是类型4,飞行意大利面怪物是类型4.与比较字符串相比,cpu比较字节更容易按几个数量级的顺序.
此外,他是正确的,在C代码或任何代码中使用ENUM可能是一个问题:
>如果更改定义(尤其是顺序),则需要重新编译程序和所有链接的程序(如果它是库).那是一种痛苦.
>如果您需要与不同语言交互,那也可能很痛苦.您需要同步多个定义.
>管理ENUM很麻烦,尤其是删除类型.
你可以通过一个将字符串转换为枚举的函数或其他方式来解决这个问题.
但也有好处:
>如果更改怪物类型的名称,任何空中怪物都可以保留类型4,即使您将它们重命名为飞行怪物.数据库中的数据一致性是保证的,因为它是一个字符串.如果你使用字符串,就没有无痛的转换方式.好吧,查找和替换将在代码中执行,但不在数据库中执行.
>这是一种有效的格式.它会节省10个字节.我的经验是,这很少重要,除非你有数千万条目.
TL; DR
没有客观的答案.
如果您发现程序员最容易,那么字符串可能是更好的选择.如果您发现编译器优化最重要,那么枚举是更好的选择.
我的观点是编译器优化很少很重要,但程序员时间很少.我自己主要使用字符串,除了某些数据库.
所以是的,你的家伙有一个观点.