2011-01-19 46 views
8

我有一個包含25列的表,其中20列可以對某些(30-40%)行具有空值。 現在具有20個空列的行的成本是多少?這個可以嗎?Sql設計問題

或者

這是一個好的設計有另一個表來存儲那些20列和REF添加到第一臺? 這樣我只會在有值時才寫入第二個表。

我使用SQL Server 2005將遷移到2008年的未來。

只有20列是VARCHAR,休息SMALLINT,smalldate

我所存儲: 這些列存儲它屬於該行的不同屬性。這些屬性有時可以爲null。

表將於〜行

的十億請評論。

+6

您正在使用哪個數據庫服務器? SQL Server 2008支持稀疏列的概念,以最小的影響支持您的方案。 – 2011-01-19 00:20:01

+0

看看這個答案:http://stackoverflow.com/questions/229179/null-in-mysql-performance-storage/230923#230923和http://dev.mysql.com/doc/refman/5.0/連接/工作與空。html – RobertPitt 2011-01-19 00:21:24

回答

2

您應該描述您正在存儲的數據類型。聽起來這些列中的一些應該移到另一個表中。例如,如果您有多個表示相同類型數據的多列的列,那麼我會說將它移動到另一個表另一方面,如果需要這麼多列來描述不同類型的數據,那麼你可能需要保持原樣。

所以它種取決於你模擬什麼。

2

有些情況下需要某些列嗎?如果是這樣,那麼也許你應該使用某種形式的繼承。例如,如果這是關於醫院中患者的信息,並且有一些數據只對女性患者有意義,那麼您可以創建一個女性患者列表。必須始終爲女性患者收集的那些列可以在該單獨的表中被宣佈爲NOT NULL

2

這取決於數據類型(40個可爲空的整數是要基本上採取相同的空間40不可爲空的整數,而不管值)。在SQL Server中,使用普通技術的空間相當高效。在2008年,你確實有了SPARSE功能。

如果你有一個可選的1垂直分割表:1的關係,有一個觀點包裹兩個表和視圖添加觸發器,使之更新,並且隱藏了底層實現的可能性。

所以有很多的選擇,其中有許多可以看到的數據負載和行爲後實施。

1

根據您擁有的不同屬性創建表。因此,如果您有一些數據在某些列中不適用,那麼將這些數據放在沒有這些列的表中是有意義的。儘可能避免在多個表中重複相同的屬性。確保你的數據至少是Boyce-Codd/5th Normal Form,你不會犯太多錯誤。