Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database design 使用整型vs字符串表示一个";“类型”;值(数据库和类设计)_Database Design_Enums_Class Design_Value Type - Fatal编程技术网

Database design 使用整型vs字符串表示一个";“类型”;值(数据库和类设计)

Database design 使用整型vs字符串表示一个";“类型”;值(数据库和类设计),database-design,enums,class-design,value-type,Database Design,Enums,Class Design,Value Type,我一直在开发一些手机游戏,这些游戏从服务器数据库获取数据 我习惯于将“type”值存储为整数标识符,并在客户机中存储一个enum来标识来自服务器的数据 例如: 在数据库表上: 怪物表:怪物ID(int)、名称(字符串)、怪物类型(int) 在客户端代码上: typedef enum { MonsterTypeGround = 1, MonsterTypeAquatic = 2, MonsterTypeAmphibious = 3, MonsterTypeAeria

我一直在开发一些手机游戏,这些游戏从服务器数据库获取数据

我习惯于将“type”值存储为整数标识符,并在客户机中存储一个enum来标识来自服务器的数据

例如: 在数据库表上:

怪物表:怪物ID(int)、名称(字符串)、怪物类型(int)

在客户端代码上:

typedef enum {
    MonsterTypeGround = 1,
    MonsterTypeAquatic = 2,
    MonsterTypeAmphibious = 3,
    MonsterTypeAerial = 4
}MonsterType;
注意,上面的代码是Objective-C,我可以在其中分配整数值。但是我也使用C++和C++。 然而,我们的数据库人员说枚举是一种编译器技巧,没有枚举数据类型这样的东西。他认为整数类型标识符使人们(其他开发人员)很难理解这些值的含义,而且,如果不查看客户端代码,他们不可能知道等价物,枚举不好,因为您需要确保枚举与服务器端ID同步,并且最好使用字符串

我的问题是:这件事有没有客观正确的答案

除了在客户机代码上使用枚举之外,是否还有其他选择,但仍将在服务器数据库中使用整数?

详细答案 你的数据库管理员显然错了。当然,如果有类似于枚举数据类型的东西。您在示例中提供了一个。MySQL知道这一点。很多编程语言都有类似于枚举的东西

但他也是对的,因为编译器经常(总是?)优化枚举。如果有四个选项可以用1到4完美地表示,但我们碰巧发现可识别字符串更容易在代码中读取。但是编译器没有这样的问题,事实上也不在乎数量。空中怪物是4型,飞行的意大利面怪物是4型。与比较字符串相比,CPU比较字节更容易达到几个数量级

此外,他认为在C代码或任何代码中使用枚举都可能是一个问题,这是正确的:

  • 如果更改定义(尤其是顺序),则需要重新编译程序以及所有链接的程序(如果它是库)。这是一种痛苦
  • 如果您需要与不同的语言交互,这也可能是一个难题。您需要同步多个定义
  • 管理枚举很麻烦,尤其是删除类型
  • 您可以通过使用将字符串转换为枚举的函数或其他方法来解决此问题

    但也有好处:

  • 如果你更改怪物类型的名称,任何空中怪物都可以保持类型4,即使你将它们重命名为飞行怪物。数据库中的数据一致性是有保证的,因为它是一个数字。如果使用字符串,就没有无痛的转换方法。嗯,查找和替换可以在代码中完成,但不能在数据库中完成
  • 这是一种有效的格式。它将为您节省10个字节。我的经验是,这很少重要,除非你有数以千万计的条目
  • TL;博士 不,没有客观的答案

    如果您觉得程序员的简易性最重要,那么字符串可能是一个更好的选择。如果您认为编译器优化最重要,那么枚举是更好的选择

    我的观点是编译器优化很少重要,但程序员的时间很少。我自己主要使用字符串,但在某些数据库中除外


    是的,你的人说得有道理。

    好吧,这就是。。潜在的反对票来源,但enums是我最喜欢的东西之一

    观点 关注最适合您的设计和代码的内容。不使用枚举,因为数据库没有该“数据类型?”确定。那么,出于同样的原因,让我们不要创建任何自定义类。那是胡说八道

    枚举善 (注意:我用C#编码)

  • 允许您根据问题域声明内容。字符串是字符串,但怪物类型枚举是怪物(类型)
  • 枚举本质上是强类型的。使用未定义的枚举值是一个编译错误。OTOH,字符串输入错误是另一个调试会话
  • 我特别喜欢
    switch
    语句。击败Helloutta整数:
    开关(怪物类型)
  • 枚举可以详尽地定义所有有效值
  • 倾向于文件化
  • 代码质量增强程序-确保您必须重新编译以添加新成员,但这是经过深思熟虑的,如果缺少相关的代码更改,则与未在某个地方处理的新字符串值相比(这是一件好事),该字符串值表现为难以捉摸的逻辑/处理错误,需要您进行调试会话
  • 默认为零,不为空。有趣的是,空概念会把事情搞得一团糟。在它所属的数据库中保持“null”
  • 亲编码提示:始终明确定义默认成员。回复:
    MonsterType.Unknown=0
    。您的回报将是编写更简单的代码,更少的错误,更容易阅读。您的维护程序员将感谢您
  • 弦坏
  • 默认值为空。这是一场围绕空字符串和“空字符串”的持续战斗。我经常看到这样愚蠢的、充满错误的代码:
    if(string.IsNullorEmpty(myString.Trim())…
    -如果myString为null,您的程序就会出现运行时异常。枚举无法发生
  • 字符串比较区分大小写
  • 容易出错的错误
  • “string”类型是泛型的,不能帮助您在域中表达您的问题
  • 设置
    myString=null
    ,从数据库中获取的不是一个带值的变量,它甚至不是一个对象,但我们尝试像对待它一样对待它
  • 整数观测
    if(MonsterType==3).
    这到底是什么意思?努夫说

    这里有一个实践练习。在你的IDE中,点击“3”并让它“查找定义”。如果你的IDE可以说话,它会说“为什么你不定义你的问题域中的东西,而不是期待我呢?”