1

三个小数列 [Number(1)] >>

OptionA | 0/1
OptionB | 0/1
OptionC | 0/1

或更大的字符串列 [Varchar2(29)] >>

Options | OptionA=0/1|OptionB=0/1|OptionC=0/1

我不确定数据库处理表的方式,但我认为将三列保持为 Number(1) 比将一列保持为 Varchar2(29) 更好!

-编辑-

让我再解释一下情况:

我正在开发一个通用框架,在该框架中跟踪所有传入/传出的请求/响应,这些交互可以引导到 DB/File/JMS;现在所有配置都从一个表中加载,该表有一列对应于输出类型,目前我使用“DB=1|FILE=1|JMS=0”作为该列的值,以便稍后如果任何人都想为他们的模块添加这个,他们可以很容易地理解发生了什么,在我的代码中,我编写了一个简单的逻辑,用“|”分割字符串 然后我使用独占或运算符使用开关盒在选择之间切换..

一切都已经完成,但我不喜欢一个大列优于三个小列的想法 + 它会删除我正在做的拆分字符串。

-编辑-

我终于明白了,可能存在我们必须添加更多选项的情况;在这种情况下,如果我们明智地添加数据列,它将导致修改表+更改实体+添加更多 if's n all;另一方面,我最终以简单的位逻辑从它中提取了一个枚举,以在选项之间切换;这样,我需要修改枚举并为新选项添加​​一个新的处理程序,然后我们就可以开始了。

4

3 回答 3

4

使用单个列存储多条数据可能是您在数据库中可以做的最糟糕的事情。

违反第一范式至少有以下缺点:

  1. 更难查询。 OptionA = 1 and OptionB = 1 and OptionC = 0substr(options, 9, 1) = '1' and substr(options, 19, 1) = '1' and substr(options, 19, 1) = '0'.
  2. 不太灵活。 当您需要添加另一个选项时会发生什么?添加新列很容易。添加新格式可能会弄乱旧查询。例如,如果有人尝试使用substr(options, -1, 1). (尽管这是使用第三个选项的一个很好的理由 - 一个单独的表格。)
  3. 没有类型安全。 这可能是一个非常微妙和棘手的问题。假设您写substr(options, 9, 1) = 1而不是substr(options, 9, 1) = '1'. 如果有人把格式弄错了,一个值可能会毁掉很多查询。或者更糟糕的是,它只是间歇性地使少量查询崩溃,因为访问路径不断变化。(尽管您可以通过检查约束来防止这种情况。)
  4. 较慢的查询。 通常,在表达式或条件中完成的工作量对于查询来说并不是很大的成本。但是添加许多不必要的字符串操作会有所作为。
  5. 少优化。 只有 Oracle 能够理解您的数据,它才能构建高效的查询计划。例如,假设 OptionA 99.9% 的时间为“0”。当您进行过滤时OptionA = 0,Oracle 可以使用直方图对返回的行数做出非常准确的预测。但因为substr(options, 9, 1) = '1'你只会得到一个疯狂的猜测。如果您有使用此列的复杂查询,您可能会花费大量时间尝试“修复”基数估计。(虽然也许表达统计可以帮助解决这个问题?)

有时非规范化是个好主意。例如,如果您有 TB 的数据,并压缩表,则单个列可能占用更少的空间。(但如果你想节省空间,为什么不使用像“000”这样的格式呢?)。

如果确实有充分的理由,那么肯定需要记录在案。也许在专栏上添加评论。

于 2012-04-27T05:25:34.317 回答
1

首先,如果我正确地阅读了您的问题,您希望每个选项都具有两个可能的值之一,对吗?

如果是这样,那么您可以:

  • 每个选项都有一个单独的整数(或布尔)列
  • 有一options列是 1 和 0 的字符串,每个选项一个数字,例如“001”
  • 使用整数的“选项”列,并为每个选项使用一个位值,例如 optionA == options & 1、optionB == options & 2 等。
  • 某些数据库具有您可以使用的位向量数据类型。对于 mysql 有BIT数据类型,它可以存储长达 64 位的位串。

对于这些中的每一个,都将在代码复杂性和效率之间进行权衡。问问自己,通过使用这些选项中的每一个,将节省多少机器的时间或存储空间?将节省多少时间?

于 2012-04-26T12:09:46.027 回答
1

在这种情况下,我会推荐 3 列方法,这不仅在提取数据方面使事情变得简单,而且您是否希望可以针对所有 3 列设置值,而不是仅限于一个 VarChar2 字段。如果您选择单列 VarChar2,那么使用 substr 命令或其他变体提取您需要的信息相当简单,虽然这对于 Oracle 数据库来说不是繁重的工作,但它确实在服务器上增加了额外的工作这是没有必要的。

于 2012-04-26T12:32:30.267 回答