2011-09-06 74 views
0

假設我有一個房地產物業(公寓,房屋,工業空間,辦公室)的數據庫,每個數據庫都有一組共同的屬性(所有結構的共同屬性,如地址,價格,描述文字,座標,建築物內的可用表面,電阻框架材料類型(鋼,木材,粘土:D等)等)。 我應該:關於數據庫設計和視圖的問題

1)創建表公寓,房屋,辦公室等,當我做一個涉及所有結構的選擇查詢時,使用一個視圖(說all_constr),從所有表中選擇基於共同的屬性,然後根據各種標準(如用木頭製成的或用(混凝土 - 鋼或粘土)等製成的框架來改進結果)

我並不確定一個視圖如何在罩下工作但我認爲,如果我做類似

 SELECT * FROM all_constr AS a --all_constr is the view 
    WHERE a.price <50000 AND a.surface >100 ; 

每次我運行上述查詢特定建築物表迭代一次創建虛擬表,然後再次執行過濾。這似乎不是很有效。另一方面,如果虛擬表AKA視圖被存儲爲真實表,那麼它與情況2)幾乎是相同的情況+如果我想查看特定於建築物的詳細信息,那麼我的運氣不好,因爲沒有獨特的跨越房屋,APS等標識符 一種解決方案,我認爲,將創建這樣的視圖:

 CREATE VIEW all_constr AS 
    SELECT x.common_att1, x.common_att2, x.tableoid, x.id 
    FROM aps AS x 
    UNION ALL 
    SELECT x.common_att1, x.common_att2, x.tableoid, x.id 
    FROM houses AS x 
    UNION ALL 
    SELECT x.common_att1, x.common_att2, x.tableoid, x.id 
    FROM ind_spaces AS x 

2)創建另一個表(說構造)和鏈路APS,房屋這樣的:

http://imageshack.us/photo/my-images/31/unledkwx.png/ 這具有不需要使用類似表格的優點

那麼哪個你會推薦看到我多次聽到和閱讀使用視圖是好的做法嗎?

LE:如果可能的話我想避免使用繼承其過於Postgres的特定的(我不介意非常多壽,只要它是最佳的解決方案)

回答

1

在PostgreSQL中,觀點是rules的簡寫。

查詢計劃程序遇到規則/視圖時,會將規則中的查詢片段替換爲當前查詢,並繼續優化查詢。

與您直接從視圖中輸入查詢相同; postgresql會優化查詢,就好像根本沒有任何視圖一樣,並且做到最有效的事情。使用視圖不會影響性能。

0

將所有常見的東西合併到一個表中,然後在此表中添加一個'type'(保留字...)列。使可選屬性爲空,或將它們放入一個或多個單獨的表中。