【问题标题】:Why are such specific data types needed when creating database tables?为什么在创建数据库表时需要这种特定的数据类型?
【发布时间】:2010-01-21 04:04:37
【问题描述】:

采取以下创建表语句:

create table fruit
{
  count int,
  name varchar(32),
  size float
}

为什么不使用“字符串”、“数字”、“布尔”或更好的数据类型,而不是那些特定的数据类型,根本不必指定任何数据类型。

拥有这种特定数据类型的技术原因是什么? (相对于通用或无数据类型)

【问题讨论】:

    标签: database database-design


    【解决方案1】:

    想象一个表中有 2000 万行,其中所有数字都是 1 到 10 的 int 列。

    如果您为此使用 tinyint,则需要 1 个字节。如果您使用常规 int,则需要 4 个字节。这是磁盘空间量的四倍,磁盘空间增加 60 MB

    理论上,您可以设计一个数据库引擎来“智能配置”一个表,但想象一下我们的理论表,其中数据库突然决定需要为列中的数据分配更多字节。整个表将需要重新分页,并且在引擎重组表时性能可能会慢到爬行数小时。 有太多的极端情况和出错的方法,因此与一开始就正确设计应用程序相比,掌握自动配置的工作量更大。

    【讨论】:

    • 演出还是梅格?应该是 58 兆吧?
    • 计算器,你为什么嘲笑我!感谢现场;)
    • @SQLMenace,是的,你是对的:3B*20,000,000 = 60,000,000B = 60,000KB = 60MB(58,593.75KiB,57.22MiB)
    【解决方案2】:

    它设置了排序和索引策略,以及强制数据完整性。

    想象一下。

    MyNumberField 为泛型:“1234”、13、35、“1234afgas”

    为什么有一些字符串,为什么“1234afgas”中有字母?

    使用类型约束是不允许的。

    【讨论】:

    • 对索引没有影响,对排序有影响。最大的原因是数据完整性。
    【解决方案3】:

    因为大小和存储不一样

    tinyint = 1 字节

    smallint = 2 个字节

    int = 4 个字节

    bigint = 8 个字节

    因此,如果您知道您只需要存储一定范围内的数据,则无需使用 bigint 并产生每行存储额外字节的开销

    同样适用于字符串(char、varchar 等)

    还内置了约束...不能将字母 A 存储在 int 中...数据将是干净的..

    【讨论】:

      【解决方案4】:

      您不仅要告诉数据库系统您将如何使用数据:字符串、布尔值、数字。您还告诉数据库要使用哪种内部表示。这对于空间、索引和性能的原因很重要。

      【讨论】:

        【解决方案5】:

        除了其他人发布的内容之外,还有一个数据完整性问题。假设您将值“1”存储到数据库中,如果将其视为 TRUE,则为数值 1,字符串“1”...

        如果两列的值为“1”,那么 col1 + col2 等于数字 2 还是字符串“11”?

        【讨论】:

          【解决方案6】:

          除了已经说过的,有些数据库不需要数据类型,例如 SQLite (http://www.sqlite.org/)。

          【讨论】:

          • 有意思,为什么这个数据库不需要数据类型?
          • @SQLMenace:您阅读了链接到的页面吗?它是这样说的:SQLite 版本 3 数据库中的任何列,除了 INTEGER PRIMARY KEY 列,都可以用于存储任何存储类的值。
          • @roygbiv:查看@SQLMenace 给出的链接,它很好地解释了整个想法。基本上,这样数据库可以更加灵活。虽然,作为数据库设计师,在同一列中使用不同数据类型的想法让我有点畏缩,但 SQLite 确实 支持它。我可以看到这对于原型设计有什么好处,但对于真正的应用程序来说却不是很好,因为这个线程中的其他人已经说明了原因。
          • 事实上,在SQLite中你可以成功运行这个命令:CREATE TABLE mytable (field1, field2, field3)
          • SQLite 应该用于嵌入式使用和/或替换原本存储在文本文件中的内容。任何考虑使用它来替换“真实”数据库用例的人都是疯子。
          【解决方案7】:

          有些数据库不输入,我想到的是 IBM 的 Universe DB(又名 Pick)。使用该 Db,所有字段都是字符串类型,您可以通过“字典”定义它们的使用方式。

          在广泛使用强类型数据库和 Universe 之后,从编程的角度来看,我偏爱强类型数据库。

          【讨论】:

            【解决方案8】:

            可以在任何地方提出任何类型的相同问题。为什么类中有类型?这是对数据的限制和期望。您希望获得 x 类型,以便您可以处理 x 类型。您不想在每次处理一条数据时都处理无限的可能性并进行大量类型检查。

            无论是原始类型还是创建类型,都可以定义所持有的结构。就是说 N 是 X 类型,你可以做 X 类型能做的所有事情。

            您是说,例如,我正在处理一个整数,它可以在某个数字范围 -X 到 X 中,而一个大整数可以在更大的数字范围 -Z 到 Z 中。(作为具体例子)。使用预期将落在这些范围内。

            正如其他人所提到的,您还定义了如何在较低级别存储信息。说你有一个整数的事件有点脱离机器的抽象。

            【讨论】:

              【解决方案9】:

              除了存储,某种数据类型也是一种约束类型 例如,如果您知道某个帐号将恰好包含 8 个字符,那么在类型中定义它是您可以做的最合乎逻辑和最高效的事情。 (例如 nchar(8))

              您正在以这种方式立即在字段类型中设置域(或其中的一部分,可以通过其他约束进一步细化)。

              【讨论】:

                【解决方案10】:

                数据库的主要功能之一是能够高效地对大量数据执行操作。对数据类型非常具体会增加数据库引擎可以假设的关于其存储的数据的数量。因此,它必须执行更少的计算并更快地运行,并且可以避免分配它不需要的存储空间,这使得数据库更小,因此速度更快。

                数据库的其他主要功能之一是确保数据完整性。您越准确地指定应在字段中存储哪种数据,您在该字段中意外存储错误数据的可能性就越小。这类似于为什么您的 C 编译器对您编写的代码如此挑剔:您应该更喜欢处理编译时错误而不是运行时错误。

                【讨论】:

                  猜你喜欢
                  • 2015-05-23
                  • 2011-09-13
                  • 2021-12-26
                  • 2018-07-08
                  • 2011-07-24
                  • 2016-05-29
                  • 1970-01-01
                  • 2015-10-23
                  • 1970-01-01
                  相关资源
                  最近更新 更多