2015-06-04 83 views
1

假設我有以下表模式處理數據庫模式中的缺失值?

MONTH VARCHAR(10) 
HASRAIN BOOLEAN 
YEAR INTEGER 

現在假設某年,我有11個月值,但沒有價值的遺留月(姑且稱之爲9月)。

它是更正確的:

  1. 將一個記錄與零值,或

  2. 不留記錄當月

我的問題是:如何模擬數據庫模式中信息的缺失?

+1

無記錄或無記錄 - 如果您添加了零值,您如何分辨「根本沒有下雨」和「我不知道下了多少雨」 – stuartd

回答

2

如果不需要關於某個實體的信息來理解另一個實體,那麼這些信息在認知上並不相互依賴,並且可以進行歸一化。

這是什麼意思,在一般的做法是,你應該爲兩個實體分開表,並使用外鍵在它們之間引用。

想象一下:

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 

這個例子展示了我們如何知道無論天氣如何,或者我們不知道。

如果你會在weather_month表中放置大量的可空字段(這是一個相當常見的做法),它不會像在這個設置中那麼清晰,你可以觀察天氣或者你沒有。

關係數據庫對於「我沒有價值」使用NULL,但是您應該真正考慮如何使用它,因爲您所做的數據庫設計應該爲您的數據結構說話,如果它爲自己說話,您不會有向人們解釋。節省您的時間。

0

在存儲效率方面,NULL可能更合適,特別是如果您期望它們中的大多數沒有價值。否則,根據您的業務需求,0也可以做到這一點。

此外,您可能需要考慮如何輕鬆地查詢沒有記錄。說在某一年,你有幾個月沒有價值。如果您將它們保存在特定列的w 0/NULL表中,彙總它會更容易。

0

看起來像兩個表對我說:

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

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

所有月份將包括在日曆表。 WEATHER表中只包含具有天氣信息的月份。