0

想要規範化和優化此表格'table1'真的很感謝。我現在可以執行以下查詢:關於表格標準化的幫助

SELECT user AS users 
FROM table1 
WHERE project='Project B' 
AND doctype='DocType B' 

得到我想要的東西,但我覺得它不是很有效,想就如何改善幫助(解釋)。

最後我想實現以下目標:
1)打破這個1臺到多個表,便於鑑於「項目」和「DOCTYPE」維護
2)的,退還所有用戶

表1:

project  doctype  user 
-------  -------  ---- 
Project A DocType A User A 
Project A DocType A User B 
Project A DocType A User C 
Project A DocType A User D 
Project A DocType B User A 
Project A DocType B User C 
Project A DocType B User D 
Project A DocType C User B 
Project A DocType C User D 
Project B DocType A User B 
Project B DocType A User E 
Project B DocType A User F 
Project B DocType A User G 
Project B DocType B User A 
Project B DocType B User C 
Project B DocType B User E 
Project B DocType B User H 
Project B DocType C User A 
Project B DocType C User I 

請讓我知道是否需要更多信息來幫助。 謝謝。

+0

我對數據庫瞭解不多,但對我來說已經很不錯了。你的表已經是BCNF了,你的查詢非常簡單。 – Owen

+0

@Owen:表格看起來像是「全部關鍵」。所以,5NF。 (沒有非關鍵依賴關係,因爲沒有非關鍵列。) –

+0

@Catcall查看數據看起來像User + DocType-> Project,但這可能是巧合。 – Owen

回答

5

由於表是'全鍵',並且由於沒有重複,因此沒有明顯的方法通過歸一化來減少表。你可能會創建3個帶有成對列的表格:PD,PU和DU(使用列的首字母組成表格名稱)。但是由於用戶A與項目A上的DocType A關聯,但與項目B上的DocType A關聯,因此在此示例中不起作用。

5

標準化不是爲了便於維護而拆分表格。關於提高性能也沒有正常化。它是以關係方式表示邏輯事實,以最小化冗餘和數據異常。如果你想正確地瞭解標準化,請閱讀C. J. Date的SQL and Relational Theory

我會堅持單個表,但添加一個索引。一些品牌的RDBMS支持索引只有查詢,即如果查詢可以檢索索引數據結構內所需的列,則它可以跳過完全查詢基表。 Microsoft SQL Server和MySQL是支持僅索引查詢的數據庫的顯着示例。

所以我建議在三列(項目,文檔類型,用戶)上創建一個索引,看看是否改善了您的查詢性能。