【问题标题】:SQLite3's dynamic typingSQLite3 的动态类型
【发布时间】:2011-01-30 04:51:21
【问题描述】:

与其他风格的 SQL 相比,SQLite3 使用动态类型而不是静态类型。 SQLite website 内容如下:

大多数 SQL 数据库引擎(据我们所知,除 SQLite 之外的所有 SQL 数据库引擎)都使用静态、严格的类型。对于静态类型,一个值的数据类型由它的容器决定 - 存储该值的特定列。

SQLite 使用更通用的动态类型系统。在 SQLite 中,值的数据类型与值本身相关联,而不是与其容器相关联。

在我看来,这正是您想要的,因为它可以让您将字符串存储在整数列中。

页面继续:

...SQLite 中的动态类型允许它完成传统刚性类型数据库中无法完成的事情。

我有两个问题:

  1. 用例问题:SQLite3 的动态类型有哪些好处?
  2. 历史/设计问题:使用动态类型实现 SQLite 的动机是什么?

【问题讨论】:

  • 我的观察是 sqlite3 更依赖于连接它更智能的软件,例如指望它不在字符串列中存储整数,而不是自己提供结构。
  • 这种类型的讨论问题通常比社区 Wiki 更好,但总的来说,对于 SO 的格式来说,这是一个糟糕的问题。尝试对每个问题提出 一个 问题,最好是具体的而不是开放式的。 stackoverflow.com/faq

标签: database sqlite dynamic-typing


【解决方案1】:

这在 SQLite 中称为type affinity

根据 SQLite 网站,他们这样做是“为了最大限度地提高 SQLite 和其他数据库引擎之间的兼容性”。 (见上面的链接)

SQLite 支持列上的“类型关联”概念。列的类型亲和性是存储在该列中的数据的推荐类型。这里的重要思想是该类型是推荐的,而不是必需的。任何列仍然可以存储任何类型的数据。只是某些列,如果可以选择,会更喜欢使用一个存储类而不是另一个。列的首选存储类称为“关联性”。

我的理解是,SQLite 正是它的名字——一个非常轻量级、简约的数据库引擎。与强类型相关的开销可能超出了项目的范围,最好留给使用 SQLite 的应用程序。

不过,根据他们的网站,他们这样做是为了最大限度地提高与其他数据库引擎的兼容性。

【讨论】:

  • > 这在 SQLite 中称为类型关联。 “类型亲和性”是 sqlite 动态类型的一个特定方面——列有推荐的类型,但实际值可以是其他类型。 > 根据 SQLite 网站的说法,他们这样做是“为了最大限度地提高 SQLite 和其他数据库引擎之间的兼容性”。是的,他们确实这么说,但这是关于类型亲和力,而不是一般的动态类型。
  • 关于“与强类型相关的开销”:假设您实际上是指“静态类型”:我想使用静态类型将比动态类型更有效地实现 .例如,存储可以更紧凑,查询时可以避免许多类型检查。
  • 我为早期 cmets 的格式道歉:我认为降价是允许的。我是新来的。
【解决方案2】:

如果您查看 Firefox 的“about:config”页面,我相信这些设置实际上存储在 SQlite 数据库中(不过我不是 100% 确定)。使用 SQlite 的动态类型的好处是设置中的每个值都可以是强类型的(例如,“alerts.totalOpenTime”设置是一个整数,而“app.update.channel”是一个字符串)而不必有一个单独的每种类型的列。

这与编程语言的论点基本相同,最后:为什么编程语言中的动态类型优于静态类型?

【讨论】:

    猜你喜欢
    • 2020-07-29
    • 2011-04-29
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 2012-07-11
    • 2010-12-02
    • 1970-01-01
    • 2021-01-04
    相关资源
    最近更新 更多