Database 良好的数据库设计:枚举值:整数还是字符串?

Database 良好的数据库设计:枚举值:整数还是字符串?,database,database-design,Database,Database Design,我在表中有一列存储枚举值。例如,大、中、小或一周中的几天。这将对应于网页上显示的文本或用户从下拉列表中选择的内容。什么是最好的设计 将值存储为int,然后可能有一个表,其中包含对应于enum/int的字符串 只需将列中的值存储为字符串,以使查询更具自解释性 在什么点/数量的值最好使用整数或字符串 谢谢。继续你的第一个例子。假设您创建了一个查找表:大小。它有以下列: Id-主键+标识 名称-varchar/nvarchar 表中有三行,小行、中行和大行,如果按顺序插入,它们的值分别为1、2、3 如

我在表中有一列存储枚举值。例如,大、中、小或一周中的几天。这将对应于网页上显示的文本或用户从下拉列表中选择的内容。什么是最好的设计

将值存储为int,然后可能有一个表,其中包含对应于enum/int的字符串

只需将列中的值存储为字符串,以使查询更具自解释性

在什么点/数量的值最好使用整数或字符串


谢谢。

继续你的第一个例子。假设您创建了一个查找表:大小。它有以下列: Id-主键+标识 名称-varchar/nvarchar

表中有三行,小行、中行和大行,如果按顺序插入,它们的值分别为1、2、3

如果您有另一个使用这些值的表,您可以使用标识值作为外键…或者您可以创建第三列,这是三个值的简写值。它的值为S、M和L。您可以将其用作外键。您必须在列上创建一个唯一的约束

至于下拉列表,您可以使用其中任何一个作为幕后的值

您还可以创建S/M/L值作为主键


关于何时最好使用ints vs字符串的另一个问题。关于这个问题可能有很多争论。很多人只喜欢使用身份值作为主键。其他人说最好使用自然钥匙。如果您没有使用标识作为主键,那么确保主键有一个合适的候选者(确保它始终是唯一的,并且值不会更改)非常重要。

假设您选择的RDBMS没有枚举类型(为您处理该类型),我认为当值可能发生变化时(无论是值还是数量),最好直接使用ID而不是字符串

您可能认为一周中的几天不会改变,但如果您的应用程序需要添加国际化支持,该怎么办?(还是一家邪恶的跨国公司在控制了世界后决定给它们重新命名?)

此外,大、中、小分类可能会在一段时间后发生变化。大多数你认为无法改变的价值观,都会在一段时间后改变

所以,主要是为了预测更改原因,我认为最好使用ids,您只需要更改翻译表,一切都可以轻松地进行。对于i18n,您只需展开转换表并自动提取正确的记录


最有可能(取决于各种因素)Int的性能会更好,至少在所需的存储量方面会更好。但出于性能原因,我不会做int,出于灵活性原因,我会做int。

这是一个有趣的问题。当然,在这里你必须考虑绩效目标。如果你不想追求速度,整数是必须的。一个数据库可以索引整数而不是字符串,尽管我必须说这并不是一个糟糕的性能损失

例如Oracle数据库本身,他们可以在系统表上以字符串的形式进行大写枚举。像用户\分配\类型之类的东西是标准。正如您所说,字符串可以更具“可扩展性”和可读性,但在任何情况下,在代码中,您最终都会得到:

静态最终字符串USER\u ALLOCATION\u TYPE=“USER\u ALLOCATION\u TYPE”

代替

静态最终整数用户分配类型=5

因为你要么这样做,你最终会得到所有这些字符串文字,它们只是渴望有人去那里,并把一个字符放错地方!:)

在我的公司,我们使用带有整数主键的表;所有表都有一个串行主键,因为即使您认为不需要,您迟早会后悔的

在您描述的情况下,我们所做的是,我们有一个带有(PK Int,Description String)的表,然后我们使用连接查看主表以获取描述,这样我们可以在必要时查看连接字段描述,并保持性能

另外,通过一个单独的描述表,您可以获得关于这些ID的额外信息,而这些ID是您永远不会想到的。例如,假设用户可以访问组合框中的某些字段,当且仅当他们具有这样的属性,等等。您可以在description表中使用额外的字段来存储该字段,以代替特殊代码


我的两分钱。

我也会对人们的想法感兴趣,我总是在查找表中存储枚举,然后在引用枚举的任何数据表中存储ID并使用FK关系。在某种程度上,我仍然喜欢这种方法,但将字符串值直接放入表中有一些简单明了的地方

纯粹按大小计算,int是4字节,其中as字符串是n btyes(其中n是字符数)。查找中的最短值为5个字符,最长值为6个字符,因此存储实际值最终会占用更多空间(如果这是一个问题的话)


就性能而言,我不确定int或varchar上的索引是否会返回速度/优化/索引大小方面的任何差异?

以前没有遇到过,哪些RDBMS支持枚举?我错过了一些关于definiteFantastic的东西,我刚开始关注mySQL,所以我会密切关注它。PostgreSQL也有它:简单、简单和痛苦:如果值发生变化,数据增长到可观的数量,那么进行更新将是一件痛苦的事情。在这些变化中保持一致性也可能成为一种痛苦。扩展枚举以添加新值(如果您正在强制执行)可能会成为一个难题。可能还有更痛苦的事情我甚至没有想到。使用字符串的一个优点是它们更容易理解