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


10

我想以更直接,更笼统的方式再问一个问题

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

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

我能想到的一些例子:

  • 为每种可能的类型创建一列,并创建另一列以指示要使用的列
    • 例如:列:IntVal,StrVal,BoolVal,类型。值:null,null,True,“ BOOL”
  • 将值存储为varchar

Answers:


9

看来您已经被告知您正在走EAV模型的道路。请看此处图片,了解为什么应不惜一切代价避免使用EAV模型。

上图的负责人Bill Karwin写了一本书“ SQL Antipatterns:避免数据库编程的陷阱”,他将第一章专门介绍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>
  ..
);

对num_result进行相同的操作,除了用nresult INT(FLOAT ...等等)代替cresult-VARCHAR&c的想法相同。

然后VIEWresult_correct(和其他字段number_of_attempts-...&c。-无论其他字段是什么)的不同结果表上创建。在这种情况下,您正在像按“喜欢”进行比较,而不是执行计算,等同于根据上面引用的搞笑图像将人口增加到海拔!


作为计数器比尔,我已经写了赞成EAV的位置:sqlblog.com/blogs/aaron_bertrand/archive/2009/11/19/...
阿龙贝特朗

我认为同一逻辑列具有多个可能的类型不会构成EAV。我认为他正在寻找“变体/对象”类型。使用几列要比每种类型一个表要容易得多。听起来很不方便。创建视图之后,它实际上与在同一表中创建类型实际上是一样的。
usr

@usr我很想看看您的解决方案。
贾里德海滩

2
我觉得每种类型只有一列。我过去是那样做的。这是最糟糕的解决方案。这是另一个论点:如果有两个可变类型的列该怎么办。该答案的解决方案需要使用二次表。可以将其拆分为一个基本表,再加上N * M个其他表...这似乎不正确。
usr

@usr不是您的解决方案的一个问题,这些列都不是NOT NULL吗?就个人而言,我坚信只要有可能便NOT NULL服用避孕药。
Vérace

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.