存储可能是多种类型的值的最佳方法

Jar*_*ach 11 database-design sql-server

我想以更直接和更一般的方式重新提问

如何创建一个表来存储可能是多种不同类型的值?

就我而言,这些值提供有关事件的诊断信息。例如:事件发生 -> 存储来自多个 PLC 的读数,其中包含有关事件的相关信息。PLC 可以监控任何类型的数据。

我能想到的一些例子:

  • 为每种可能的类型创建一列并创建另一列以指示要使用的列
    • 例如:列数:IntVal、StrVal、BoolVal、类型。值:空,空,真,“布尔”
  • 无论如何将值存储为 varchar

Vér*_*ace 10

看起来您已经被告知您正在迷失在通往EAV 模型的道路上。看看这里图片,了解为什么应该不惜一切代价避免使用 EAV 模型。

负责上图的作者 Bil​​l Karwin 写了一本书“SQL 反模式:避免数据库编程的陷阱”,他将第一章用于 EAV 反模式。他也是这个小组的重要人物,在 StackOverflow上也很出色(针对数据库问题)。

我的建议是为每种类型的结果准备一个表格,然后VIEW在必要时使用s 将它们组合起来。

例如,你可以有

CREATE TABLE char_result
(
  question_id INT,
  user_id INT,
  cresult CHAR,
  result_correct BOOLEAN (or equivalent in your RDBMS)
  ..
  <other stuff>
  ..
);
Run Code Online (Sandbox Code Playgroud)

对 num_result 做同样的事情,除了用 nresult INT (FLOAT...whatever) 代替 cresult - VARCHAR &c 的想法相同。

然后VIEW在您的不同结果表上创建s result_correct(和其他字段 - number_of_attempts... &c. - 无论您的其他字段是什么)。在这种情况下,您是在比较 like 和 like 而不是按照上面引用的搞笑图片进行相当于将人口添加到海拔高度的计算!

  • 每种类型只有一列对我来说似乎没问题。我过去就是这样做的。这是最不坏的解决方案。这是另一个论点:如果有*两个*可变类型的列会怎样。这个答案的解决方案需要平方数的表。可以将其拆分为一个基本表加上 N*M 个表......这似乎不对。 (2认同)