我目前正在Oracle中创建一个小表,并且不确定为特定列选择哪种数据类型。
该列标记为“保留”,我希望它仅包含这些值“短”,“中”和“长”。最终目标是将这些值放在表单的下拉列表中。
我是否正确选择数据类型'char(6)'?
是否可以使用Oracle表单构建器将其转换为值列表?
感谢您的时间。
答案 0 :(得分:4)
首先,我将列命名为“StayDuration”或“StayLength”,因为“保持”本身仍然有点令人困惑。一旦完成,我会看到两种可接受的方法:
我倾向于避免直接在这里存储varchar类型的数据。它需要更多的存储空间,并且很容易导致错误输入或过时的数据。
也可以使用混合方法,这样第一个选项中新表的“键”映射到第二个选项中提出的整数值。
答案 1 :(得分:2)
基本上有3种选择:
我认为Enum是'最干净'的选择。但是有些ORM不能正确支持。
这个问题对你来说可能很有意思:
答案 2 :(得分:2)
使用VARCHAR2(6)。 CHAR(6)具有空白填充语义,使用起来很奇怪;它还意味着每次使用时都会为“Long”一词存储完整的6个字符。几乎没有令人信服的理由使用CHAR而不是VARCHAR2。
答案 3 :(得分:1)
如果有可用的ENUM类型,请使用它。否则,我建议两个选择:
将其存储为单个字节(或可用的最小整数类型)。然后,您可以随意转换为应用程序中的枚举。我认为这是最干净的方法,并且很好地将ComboBox
es绑定为键值对。
您还可以将字符串存储在单独的表中,并将现有列作为此新表中的外键。然后很容易在此表上加入并获得快速字符串查找以显示在表单上。但是,这是额外的开销,可能会将您的字符串放在两个位置 - 您的应用程序和数据库。此外,如果您想要本地化,那么您将陷入困境。
如果要在此列周围构建任何应用程序逻辑,我不建议使用字符串(VARCHAR / CHAR)选项。你会被困在整天比较字符串,恕我直言,这是相当丑陋和缓慢。它们的排序和查询速度也比简单的整数类型慢。 (但是,在您的示例中是安全的,因为您可以比较第一个字符'S','M'或'L' - 单个字节。但您必须明确指示它以这种方式排序和查询。)
如果您只想显示值,可以使用字符串,但请记住大小。通过存储字符串,您的数据库很容易变大:
答案 4 :(得分:0)
使用值为'S','M','L'的CHAR(1);可选地将列链接到第二个表,其中S / M / L是主键,“small / medium / long”是varchar(255)解释。这样,您就拥有了最佳的代码大小(1个字节尽可能短),同时仍然能够在报告中打印“漂亮”的名称。
答案 5 :(得分:0)
使用数值数据类型可以更轻松地按大小排序,如果您想做的话。我不能代表Oracle,但很多时候,使用单个字节并不能为您节省太多,因为无论如何它都会被塞进一个4字节的字中。
此外,您现在只有三种尺寸,但将来可能会有更多尺寸。使用单个字符可以区分XL和XXL尺寸是一个真正的挑战。
根据您正在处理的应用程序的类型,如果您需要本地化您的应用程序,那么在数据库中存储呈现给用户的字符串可能会产生影响。如果您将整个数据库作为应用程序的一部分发布,只要您将它们放在查找表中就没什么大不了的。例如,如果您正在处理需要让不同用户以不同语言访问同一数据库的Web应用程序,则可能会导致一些问题。