14

在过去的几年中,我主要与 Oracle 合作,并且非常习惯于将单字符 varchar 列用作布尔值。

我还可以看到(每个堆栈溢出答案),MySQL 的建议类型是 TINYINT。

现在我开始了我的小项目——使用 DerbyDB,它支持 BOOLEAN 列,但直到版本 10 左右。

那么,问题是,为什么在设计关系数据库时很难合并一个 BOOLEAN 列?我是否遗漏了某些内容,或者只是将待办事项列表推到了不重要的位置,因为您可以同时使用另一种列类型?

4

4 回答 4

13

具体来说,就 Derby 而言,答案有点奇怪:开源数据库 Derby 曾经被称为 Cloudscape,是一个专有产品。当时,它完全支持 BOOLEAN。

随后,Cloudscape 被 IBM 收购的 Informix 收购,IBM 工程部决定让 Derby 与 DB2 兼容。这样做的原因是,如果这两个数据库兼容,用户将更容易在 Derby 数据库和 DB2 数据库之间迁移他们的应用程序。然而,工程人员并没有从 Derby 中删除与 DB2 不兼容的特性,他们只是在 SQL 语法中禁用了这些特性,而将大部分实现留在原处。

随后,IBM 将 Cloudscape 开源给 Apache Software Foundation,将其命名为 Derby。开源社区不再受限于 Derby 与 DB2 完全兼容的要求,决定恢复对 BOOLEAN 数据类型的支持。因此,Derby 现在支持 BOOLEAN 数据类型。

于 2012-07-15T16:46:00.043 回答
7

Tom Kyte 与您在此博客条目中的最后一句话非常相似:

“它不是我们拥有的类型——我不能说更多也不能更少。ANSI 没有它——许多数据库都没有它(我们当然并不孤单)。在宏伟的计划中——我会说这个的优先级相当“低”(这是我的看法)。

他是从 Oracle 的角度说的,但它适用于任何关系 RDBMS。

于 2012-07-15T17:50:47.297 回答
2

boolean只要我能想到,PostgreSQL 确实支持。

我能找到的最古老的在线文档是 1998 年 3 月 1 日发布的 6.3 版。他们提到了布尔类型:

http://www.postgresql.org/docs/6.3/static/c0805.htm

后来的文档中,他们提到 SQL99 作为他们遵循的标准。

Since SQL99 seems to mention this type I would assume, that many DBs did have support for that type quite well before 1999.

于 2012-07-15T19:09:25.677 回答
0

我不知道,因为我还没有设计过,但我的猜测是,由于 RDBMS 是关于描述和存储事物的集合,因此不需要布尔字段,因为它们也可以表示集合中的内容,但它们是无关,因为集合的成员将来自数据库的实际数据或结构。

例如,对于赋予员工的角色,他们要么是经理,要么不是经理,取一个布尔列。您可以使用布尔列来描述这一点,但您应该做的是为经理提供一个表格,为非经理提供一个表格,或者(这将是更灵活且可能更易于管理的方式)创建一个额外的“外观up”表,它提供角色(作为单个文本列)和然后在员工表中引用的键(外键)。


我想我应该补充一点,大多数时候你在表格中看到一个布尔字段,这是一种代码味道,因为它将要 可能会影响性能 - 在 where 子句中使用布尔值将调用表扫描并使表上的索引相当无意义(但请参阅评论以进一步讨论此问题)。我冒昧地猜测布尔数据类型已添加到大多数 RDBMS 中,用于它们的过程语言扩展(T-SQL、PLSQL),以帮助处理所需的奇怪条件语句。

于 2012-07-15T13:48:40.850 回答