【问题标题】:SQL table with a column which may have "multiple types of NULL" values具有可能具有“多种类型的 NULL”值的列的 SQL 表
【发布时间】:2023-03-23 22:02:01
【问题描述】:

标题可能有点混乱,所以我需要澄清一下。

我有以下调查数据集,需要传输到 PostgreSQL 数据库。

| id | title | income | age    | height | weight | Education   |
| 1  | foo   | 10000  | 45     | 170    | 50     | College     |
| 2  | bar   | 15000  | -20000 | -30000 | 45     | High School |
| 3  | hoge  | -10000 | -10000 | 150    | 60     | -20000      |
| 4  | fuga  | 20000  | 20     | -10000 | 70     | College     |
...

其中-10000、-20000、-30000都代表空值,但原因不同。
(例如,-10000 表示未向参与者显示有关该列的问题,-20000 表示参与者跳过问题,-30000 表示他们回答无效。)

问题是,如何设计表和约束来模拟这种情况?

显然,如果我将 INTEGER 用于收入和其他列,并将 VARCHAR 用于教育,则空值将不相同。此外,如果我将收入视为单纯的 INTEGER,则“null”值将只是一个负数,这将在以下数据操作中出现问题。

【问题讨论】:

  • 对于这些特定的负值仅使用NULL 有什么问题?
  • 我需要在进一步的数据分析中区分“为什么值为null”。
  • 对于记录高度值为-30000的人,这代表什么,以及高度的原始值是多少?
  • 表示参与者输入了无效值(例如-200)。我没有原始值。
  • @kemakino 。 . .问题实际上是您将如何使用数据。您很可能希望用户定义的类型或实体属性值模型来表示这一点。

标签: sql postgresql database-design


【解决方案1】:

我认为这里最好的设计是为每个数据列添加状态列,假设您想要跟踪给定列的状态。像这样的:

| id | title | income | age    | age_code | height | height_code | weight | Education   |
| 1  | foo   | 10000  | 45     | 1        | 170    | 1           | 50     | College     |
| 2  | bar   | 15000  | NULL   | 2        | NULL   | 4           | 45     | High School |
| 3  | hoge  | NULL   | NULL   | 3        | 150    | 1           | 60     | NULL        |
| 4  | fuga  | 20000  | 20     | 1        | NULL   | 5           | 70     | College     |

这里,我用码值2,3来表示年龄中的某种错误码,值4,5表示其他类型的错误码。

通常,列中的值应该只代表一件事。在这种情况下,年龄和身高列应该存储这些测量的数据,而不是这些测量的状态。我回填了NULL 数据丢失或完全无效的值。

【讨论】:

  • 感谢您的回答。我们可以在 age_code 和 height_code 中设置 2 和 3 吗?为什么要区分它们?
  • 也许您想为各个列使用不同的状态代码。这是我回答时的假设。
猜你喜欢
  • 2017-03-27
  • 2021-12-27
  • 2015-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多