基本SQL问题 - 数据类型选择

时间:2009-02-16 16:26:14

标签: sql database

我目前正在Oracle中创建一个小表,并且不确定为特定列选择哪种数据类型。

该列标记为“保留”,我希望它仅包含这些值“短”,“中”和“长”。最终目标是将这些值放在表单的下拉列表中。

我是否正确选择数据类型'char(6)'?

是否可以使用Oracle表单构建器将其转换为值列表?

感谢您的时间。

6 个答案:

答案 0 :(得分:4)

首先,我将列命名为“StayDuration”或“StayLength”,因为“保持”本身仍然有点令人困惑。一旦完成,我会看到两种可接受的方法:

  • 将您的长度放在一个单独的表中,并让现有列将外键存储到该表中。
  • 存储一个整数,以便通过简单的公式可以很容易地将整数的值扩展为停留长度障碍的实际值。 (例如:'短'停留可能是1天或更短,'中等'一周或更短,然后其他一切都很长,你可能会使用0,1和7作为你的整数。

我倾向于避免直接在这里存储varchar类型的数据。它需要更多的存储空间,并且很容易导致错误输入或过时的数据。

也可以使用混合方法,这样第一个选项中新表的“键”映射到第二个选项中提出的整数值。

答案 1 :(得分:2)

基本上有3种选择:

  • 某些数据库专门针对此情况支持Enum类型。 (不确定Oracle)
  • 您可以使用char(6)
  • 您可以使用int并在应用程序级别将这些映射到适当的类型。

我认为Enum是'最干净'的选择。但是有些ORM不能正确支持。

这个问题对你来说可能很有意思:

How to use enums in Oracle?

答案 2 :(得分:2)

使用VARCHAR2(6)。 CHAR(6)具有空白填充语义,使用起来很奇怪;它还意味着每次使用时都会为“Long”一词存储完整的6个字符。几乎没有令人信服的理由使用CHAR而不是VARCHAR2。

答案 3 :(得分:1)

如果有可用的ENUM类型,请使用它。否则,我建议两个选择:

  • 将其存储为单个字节(或可用的最小整数类型)。然后,您可以随意转换为应用程序中的枚举。我认为这是最干净的方法,并且很好地将ComboBox es绑定为键值对。

  • 您还可以将字符串存储在单独的表中,并将现有列作为此新表中的外键。然后很容易在此表上加入并获得快速字符串查找以显示在表单上。但是,这是额外的开销,可能会将您的字符串放在两个位置 - 您的应用程序数据库。此外,如果您想要本地化,那么您将陷入困境。


如果要在此列周围构建任何应用程序逻辑,我不建议使用字符串(VARCHAR / CHAR)选项。你会被困在整天比较字符串,恕我直言,这是相当丑陋和缓慢。它们的排序和查询速度也比简单的整数类型慢。 (但是,在您的示例中是安全的,因为您可以比较第一个字符'S','M'或'L' - 单个字节。但您必须明确指示它以这种方式排序和查询。)

如果您只想显示值,可以使用字符串,但请记住大小。通过存储字符串,您的数据库很容易变大:

  • 1,000,000行的CHAR(6)比使用单个字节多5,000,000字节。
  • 对于1,000,000行,使用VARCHAR(6)将产生5 = 4,000,000字节的平均长度。

答案 4 :(得分:0)

使用值为'S','M','L'的CHAR(1);可选地将列链接到第二个表,其中S / M / L是主键,“small / medium / long”是varchar(255)解释。这样,您就拥有了最佳的代码大小(1个字节尽可能短),同时仍然能够在报告中打印“漂亮”的名称。

答案 5 :(得分:0)

使用数值数据类型可以更轻松地按大小排序,如果您想做的话。我不能代表Oracle,但很多时候,使用单个字节并不能为您节省太多,因为无论如何它都会被塞进一个4字节的字中。

此外,您现在只有三种尺寸,但将来可能会有更多尺寸。使用单个字符可以区分XL和XXL尺寸是一个真正的挑战。

根据您正在处理的应用程序的类型,如果您需要本地化您的应用程序,那么在数据库中存储呈现给用户的字符串可能会产生影响。如果您将整个数据库作为应用程序的一部分发布,只要您将它们放在查找表中就没什么大不了的。例如,如果您正在处理需要让不同用户以不同语言访问同一数据库的Web应用程序,则可能会导致一些问题。