Postgresql
具有許多空值的表 VS 許多表
基本上我的數據庫知識水平使我能夠創建、選擇、刪除和一些簡單的事情。當談到性能設計時,我的知識絕對是 0。
所以我的問題是假設我有一張表格來記錄水中的物質:
這裡我只顯示 7 列,可能超過 100 列。正如您在此處看到的,那些空白欄位表示研究人員沒有對這些欄位進行測試。研究會選擇其中的幾個,所以基本上這種設計會留下很多空欄位,佔用很多空間。
我是否應該將大表規範化為較小的表,只有在輸入數據時才有條目?這個動作叫做標準化,對嗎?但是,如果我想在報表中顯示數據,這種方式將需要我加入這麼多表。
我正在使用 PostgreSQL,但我找不到查詢可以線上連接的表的最大限制。但是我有一種感覺,加入太多的表是一個緩慢的操作。我應該保留包含空值的完整表還是應該將其分解為較小的表?或者有更好的方法來做到這一點,或者你會怎麼做?
編輯:
編輯2:
據我所知,“水”是一種食譜。
對於這樣的配方,您要記錄 a) 添加了哪些添加劑和 b) 結果是什麼。
這是兩個實體,配方和添加劑。兩者都與一個關係屬性(即數量)具有多對多關係。配方的結果當然是配方的屬性,而不是配方和添加劑之間的關係之一。重要的是整個混合物。
一個典型的標準化解決方案是三個表。
一為添加劑。
CREATE TABLE additive (id serial, name text, PRIMARY KEY (id));
另一個食譜。
CREATE TABLE recipe (id serial, name text, drinkable boolean, dangerous boolean, PRIMARY KEY (id), CHECK (NOT drinkable OR NOT dangerous));
注意:我添加了一個檢查約束,即不能將被視為危險的收據標記為可飲用。
還有一張連結配方添加劑的表格。
CREATE TABLE recipe_additive (recipe integer, additive integer, amount integer NOT NULL, PRIMARY KEY (recipe, additive), FOREIGN KEY (recipe) REFERENCES recipe (id), FOREIGN KEY (additive) REFERENCES additive (id));
這是最好的主意,
是否危險或可飲用取決於數量和物質。這根本不會被儲存,因為它是計算出來的。
如果您願意,您可以將門檻值放在帶有物質的表格上。我還不清楚某些東西怎麼可能是“危險的”和“可飲用的”。
“可飲用”的名稱通常也是“可飲用的”,對吧?