处理数据库模式中的缺失值?

Handling missing values in a database schema?

假设我有以下 table 模式

MONTH VARCHAR(10)
HASRAIN BOOLEAN
YEAR INTEGER

现在假设对于特定年份,我有 11 个月的值,但没有剩余月份的值(我们称之为 9 月)。

是否更正确:

  1. 输入零值记录,或

  2. 当月不留记录

我的问题是:如何对数据库架构中信息的缺失建模?

NULL 在存储效率方面可能更合适,特别是如果您预计它们中的大多数都没有价值。否则,根据您的业务需求,0 也可以。

此外,您可能需要考虑在没有记录的情况下查询它有多容易。假设在特定年份,您有几个月没有价值。如果将它们保存在特定列的 table w 0/NULL 中,则聚合起来会更容易。

如果不需要关于一个实体的信息来理解另一个实体,则这些实体在认知上不依赖于彼此并且可以标准化。

在一般实践中,这意味着您应该为两个实体创建单独的 table,并使用外键在它们之间进行引用。

想象一下:

Table weather_month:
------------
month ENUM('Jan', 'Feb', Mar' ...) NOT NULL,
year mediumint NOT NULL,
weather_id mediumint,
PRIMARY KEY(month, year)

Table weather:
------------
weather_id mediumint NOT NULL
rain BOOLEAN NOT NULL,
clouds ENUM('Clear', 'Sparse', 'Thick', 'Cumulus', ...) NOT NULL,
temperature ENUM('Freezing', 'Thawing', 'T-shirt weather', 'Hot', ...) NOT NULL

这个例子展示了我们如何知道或不知道天气如何。

如果您将大量可为 null 的字段放入 weather_month table(这是一种非常常见的做法),它不会像此设置中那样清晰你要么观察过天气,要么没有。

关系型数据库对"I have no value"使用NULL,但你真的应该考虑如何使用它,因为你所做的数据库设计应该代表你的数据结构,如果它自己说话,你就不会向人们解释。节省您的时间。

在我看来像两个 table:

CALENDAR
+----+-----+
|YEAR|MONTH|
+----+-----+

WEATHER
+----+-----+-------+
|YEAR|MONTH|HASRAIN|
+----+-----+-------+

所有月份都将包含在日历中 table。只有有天气信息的月份才会包含在 WEATHER table.