【问题标题】:Reference values: string or integer?参考值:字符串还是整数?
【发布时间】:2013-08-23 11:47:00
【问题描述】:

我们有从数据库中的序列创建的参考值,这意味着它们都是整数。 (这不是不可想象的——尽管极不可能——它们将来可能会改变以包含字母,例如 R12345。)

在我们的 [C#] 代码中,这些应该输入为字符串还是整数?

对这些值执行任何算术运算(例如将它们相加)没有意义这一事实是否意味着它们应该被视为字符串文字?如果不是,它们应该被输入为整数(/longs),那么这背后的基本原理/原因是什么?

我已经搜索了这个问题的答案,但在 Google 或 StackOverflow 上都没有找到任何东西,因此非常感谢您的意见。

【问题讨论】:

  • 如果您不需要使用值进行计算,您可以毫无问题地使用字符串。如果您每个人都考虑使用应该使用 long (int) 并避免使用字母的值进行计算。
  • 这是一个选择。就那么简单。决定是需要的。记住 KISS,YAGNI

标签: c# database strong-typing


【解决方案1】:

还有一些其他的区别:

前导零:

您是否需要考虑这些。如果你有一个 ID 字符串,那么它将是必需的

排序:

排序顺序会因类型而异:

Integer:

1
2
3
10
100

String

1
10
100
2
3

那么您是否需要将序列按顺序排列(无论哪种方式)?

同样的参数也适用于您在数据库本身中应用的类型,因为那里的要求可能是相同的。理想情况下,正如 Chris 所说,它们应该是一致的。

【讨论】:

  • 假设您在 C# 代码中讨论排序,自定义比较器应该可以轻松地对字符串进行排序,就好像它们是整数一样,反之亦然。
  • 一百万年后我永远不会在数据库中存储前导零您会使用货币符号存储货币值吗?还是逗号? $12,345。您是否使用斜线来存储日期?12/25/2013 前导零是最终用户在显示时的额外格式。当几个字节的数值可以更好地存储值时,它们会强制您使用长字符串。长字符串使索引和键的候选者更差。它们会浪费更多的缓存内存,尤其是在主键上,因为主键存储在每个索引中。
  • @KM。如果它们是 ID 字符串的一部分,您就可以这样做,而 ID 字符串恰好由数字组成。可能是银行账号之类的。没有前导 0 就没有意义。
  • @KM: "00001234" != "0000000000000001234"。这些不是数字,它们是恰好具有数字字符的字符串。见:stackoverflow.com/questions/7207231/….
  • 在我的特殊情况下,前导零不适用(数字由 Oracle DB 序列 (.NEXTVAL) 生成,并且始终为整数。
【解决方案2】:

这里有几点需要考虑:

  1. 前导零是否重要,即01010 不同。如果是这样,请使用string
  2. 排序顺序重要吗?即 200 应该排在 30 之前还是之后?
  3. 排序和/或相等性检查的速度重要吗?如果是这样,请使用int
  4. 您是否受到内存或磁盘空间的限制?如果是这样,ints 是 4 个字节,strings 每个字符至少 1 个字节。
  5. int 会提供足够的唯一值吗?字符串可能支持无限的唯一值。
  6. 系统中是否存在不能保证可靠的链接(网络、用户输入等)?如果是文本介质,int 值更安全(所有非数字字符都是错误的),如果是二进制,则字符串更便于目视检查(如果您的 id 只是字母数字,R13_55 显然是一个错误,但12372 ?)

【讨论】:

    【解决方案3】:

    根据您的描述,这些是当前恰好由一系列数字表示的值;它们本身实际上并不是数字。顺便说一句,这就像我的电话号码:它不是一个数字,而是一组数字。

    而且,就像我的电话号码一样,我建议将其存储为字符串。前导零在这里似乎不是问题,但考虑到您将它们处理作为字符串,您不妨存储它们并为自己提供未来的灵活性。

    【讨论】:

      【解决方案4】:

      它们应该被键入为整数,原因很简单:尽可能保留相同的类型定义以避免开销或类型转换的意外副作用。

      【讨论】:

        【解决方案5】:

        有充分的理由不在您的代码中使用 intstringlong 等使用类型。在其他问题中,这会导致一些愚蠢的错误,例如

        • 在与另一个表相关的查询中使用一个表的键
        • 对一个键进行算术运算并得到一个无意义的结果
        • 将索引或其他整数与键混淆

        并且传达的信息很少:给定int id,它指的是什么表,它表示什么样的实体?您需要在参数/变量/字段/方法名称中对此进行编码,编译器不会帮助您。

        由于这些值很可能总是整数,因此使用整数类型应该更高效,并且减少 GC 的负载。但是为了防止上述错误,您可以使用包含单个字段的(当然是不可变的)struct。除了id的构造函数和getter之外,它不需要支持任何东西,这足以解决上述问题,除了需要键的实际值的几段代码(例如,构建查询)。

        也就是说,使用适当的 ORM 也可以解决这些问题,而您的工作量更少。它们也有自己的缺点,但实际上并没有那么糟糕。

        【讨论】:

          【解决方案6】:

          如果您不需要对序列进行一些数学计算,您可以轻松选择字符串。

          但是考虑一下排序:整数和字符串之间产生的顺序会有所不同,例如1, 2, 10 用于整数,1, 10, 2 用于字符串。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-10-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-03-20
            • 1970-01-01
            • 2011-06-16
            相关资源
            最近更新 更多