【问题标题】:Database table column datatype design question数据库表列数据类型设计题
【发布时间】:2011-01-26 20:05:05
【问题描述】:

有时一块数据可以表示为整数(4 个字节)或字符串。示例:电话号码为 bigint(8 个字节),邮政编码为 int(4) 等。我们有一个包含 3 列的索引值描述三元组的大表,索引是一个 5 位整数(非连续),以及我们有它作为int。 DBA 告诉我们这是一个糟糕的设计,应该始终使用 varchar 来保存此类数据,除非它可以是像 auto-inc PK 这样的有保证的整数。你同意?为什么或为什么不?

【问题讨论】:

    标签: database


    【解决方案1】:

    我的经验法则是,如果您不打算对其进行数学运算并且它不是代理键或代理键的 fk,则它是字符串数据。电话号码不是整数,它们是字符串,与邮政编码相同(顺便说一句,在美国以外的地区并不总是数字)。存储为字符串的数字通常具有并且需要前导零(请参阅美国邮政编码),将它们存储为 INT 或小数将不允许您输入有效值。如果它不是自动生成的,你怎么知道它需要是整数数据?如果你是 100% 肯定的,它不应该是一个整数(并且没有前导零),使它成为一个 int 将防止一些坏数据进入。但是,真的很确定,你不需要做它稍后会字符串数据(例如当您国际化并发现您的邮政编码不再是数字时)。

    为了对您正在做什么提供更好的建议,我需要一个更好的示例来说明您正在谈论的数据类型。您的表格数据需求对我来说并不完全清楚。

    【讨论】:

    • 他的陈述主要是电话号码和邮政编码 - 我们使用电话号码的数字组成整数 - 3/区号,7/号码和 5/extn - 15位数字。进行一些检查,例如区号 >= 200 等。邮编
    【解决方案2】:

    如果您需要做的只是表示一个 id,我建议您不要使用 VARCHAR 作为索引列。首先,索引 VARCHAR 存在不必要的处理开销。开销来自这样一个事实,即在比较之前必须通过数据库 COLLATION 转换 VARCHAR 值以用于索引目的。其次,没有理由使用可变长度数据类型——这会导致索引效率低下。第三,将整数表示为 VARCHAR 所需的空间是 INT 的 5 倍。这意味着使用 VARCHAR 时,索引将最多增加 5 倍。最后,数字数据总是有可能潜入列中。这会影响您的索引,并可能破坏数据库的引用完整性。

    【讨论】:

    • 这就是为什么我们首先选择整数 - 使用内存(但不知道它花了 5 倍)。插入语句由 servlet 方法生成,非数字数据会抛出相关异常。所以我们主要关心的是 (1) 内存使用和 (2) 效率 - 我们想要 ResultSet.getInt("id") 而不是 Integer.parseInt (ResultSet.getString ("id"))。
    • NVARCHAR Unicode 版本最高为 5 倍,否则为 2.5 倍。
    【解决方案3】:

    如果 DB 是 oracle,则 DBA 可能是正确的。对于分区和索引,VARCHAR2 类型可能比 INT 更有效。

    另外,如果你不会在 INT 字段上进行聚合或类似的操作,则没有任何收益。

    【讨论】:

    • DB 不是 oracle(它是 MySQL,我们现在叫它 oracle)?我认为我们不会对这些字段进行任何聚合。
    • 不,还没有 :) 它仍然是 MySQL。你有什么样的“选择”句子?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 2014-04-17
    • 2018-02-17
    • 2021-09-07
    相关资源
    最近更新 更多