您的設計看起來不錯。系統投入生產後,我總是喜歡在設計階段多花點時間重新組織數據。您事先不知道管理/銷售/財務人員會要求什麼樣的報告,適當的關係設計會給您更多的自由。
此外,您的性能問題不能只歸咎於幾個額外的JOIN
。你應該總是看:
- 數據卷(和物理數據佈局),
- 交易量和密度,
- I/O,CPU,內存使用情況,
- 您的RDBMS的配置,
- SQL查詢質量。
在我看來,JOIN
s將在此列表的底部。
至於RI constraints(參照完整性),我見過一些沒有任何主鍵/外鍵的項目以提高性能。主要藉口是:我們已將所有檢查嵌入應用程序和應用程序是系統中任何更改的唯一來源。另一方面,他們同意,不知道系統是否處於一致狀態(事實上,分析表明他們不是)。
我總是堅持在設計狀態上創建所有可能的鍵/約束,因爲總會有一些「牛仔」在身邊,他們會挖掘數據庫並「調整」他們看起來更合適的數據。但是,您可能需要暫時禁用或刪除批量數據操作的一些約束/索引,這也是official recommendation。
如果不確定,請創建2個測試數據庫,其中一個測試數據庫與另一個沒有限制。加載一些數據並比較查詢性能。我認爲它會相似。
在這裏,我對你的草圖的評論,決定都是你的。
爲什麼我喜歡在命名單數形式表?因爲我總是使用table
_id模式命名PK,並且IMHO pharmacy_id
看起來好於pharmacies_id
。我使用這種方法,因爲在將數據加載到主表之前執行數據一致性檢查時,我有許多通用腳本依賴於此模式。
編輯: 更多關於聯繫人。 您可以在所有表格中使用contact_id
,使其成爲主要聯繫人,無論這在您的應用程序中可能意味着什麼。如果您需要更多聯繫人以便進行某些關係,則可以使用不同的前綴,如owner_contact_id
,sales_contact_id
等。
如果你指望一個巨大的聯繫人的數量是有一些關係,如pharmacygroup
,那麼你就可以添加額外的表是這樣的:
CREATE TABLE pharmacygroupcontact (
contactid int4,
groupid int4,
contact_desc text
);
這部分複製了你的初始groupcontacts
,但由兩個FK和一個描述。 哪種方法更好我不知道,因爲我不知道如何設計應用程序。
您的列寬可能太窄。意見建議:姓氏= 35,名字= 35,電子郵件= 255 – onedaywhen 2012-04-11 07:27:52