簡體   English   中英

用於在MySQL(或任何數據庫)中存儲人員 - 多個表還是只有一個?

[英]For storing people in MySQL (or any DB) - multiple tables or just one?

我們公司有許多不同的實體,但這些數據庫實體中有很大一部分是人。 因此,我們有客戶,員工,潛在客戶,承包商和提供商,所有這些都有一些共同的屬性,即姓名和聯系電話號碼。

我可能已經過度使用面向對象的思維,但現在我正在研究制作一個包含所有人的“人員”表,標志/子表“擴展”該模型,並根據需要將基於角色的屬性添加到聯結表。 如果我們說有250,000人(在MySQL和ISAM上)會對性能產生如此大的影響,以至於未來的DBA會永遠詛咒我嗎? 我們最常見的搜索是姓名/姓氏組合。

例如,像Salesforce這樣的公司,客戶/潛在客戶/員工都在具有子視圖的集中表中(因為缺少更好的術語),還是分成不同的表?

警告:這個問題與“我們發現在現實世界中做得更好”有關 ,而不是理論設計。 我喜歡上述解決方案,並且相信通過視圖,正確的大小和准確的索引,性能不會受到影響。 我也覺得上面不算是一個MUCK,只是一張相當大的桌子。

由於您有許多不同的“類型”人員,為了進行規范化設計,使用適當的外鍵約束,最好使用超類型/子類型模式。 一個Person表(所有屬性共有)和許多子類型表( EmployeeContractorCustomer等),與主Person表的關系都是1:1,並且每種類型的Person都有必要的詳細信息。

請查看@Branko的答案以獲取示例: 多對多但來自多個表

一個“人”表是最靈活,最有效,最無故障的方法。

您可以輕松進行有限的搜索 - 例如,查找具有此姓氏的所有人以及誰是客戶。 但是當你不知道它們是什么時,你也可能會發現你必須找人 - 當你有一個'人'表時,這將是最容易的。

但是,你必須考慮一個人對你來說是多件事的可能性 - 一個顧客,因為買了東西一個承包商,因為你雇用了他們的工作。 因此,最好有一個“連接”表,它可以為您提供多對多的關系。

create person_type (
   person_id int unsigned,
   person_type_id int unsigned,
   date_started datetime,
   date_ended datetime,
   [ ... ]
)

(當然,你需要添加索引和外鍵.person_id是'人'表的FK;'person_type_id'是你所有可能的人類型的參考表的FK。我添加了兩個日期字段,所以你可以確定什么時候有人對你這么做。)

250.000的數據庫記錄不是很多。 如果您正確設置索引,您將永遠不會發現任何問題。

您應該為用戶設置類型。 這些類型應該在不同的表中,因此您可以看到類型的含義(使其成為TI​​NYINT或類似)。 如果每個用戶類型需要其他字段,則可以為此創建不同的表。

這種方法聽起來對我很好

從理論上講,有可能成為您工作的公司的客戶。

但如果不是這種情況,那么您可以根據角色將人們存儲在不同的表中。

不過像Topener所說,250.000並不多。 所以我個人覺得將每個人都存放在一張桌子里是安全的。

然后為每個角色(員工,客戶等)添加一列

即使您最終得到一個表解決方案(對於核心人員屬性),您也希望使用視圖對其進行抽象並添加一些約束。

您要做的最后一件事是向客戶發送機密信息,這些信息只應該發送給員工,因為有人沒有正確加入。 或意外交叉加入導致收入在報告中翻倍(但僅限於特定客戶,其中也有某個員工以某種方式聯系)。

這實際上取決於您希望層看起來如何以及哪些組件將訪問哪些層以及如何訪問。

另外,我想你想重新選擇MyoAM而不是InnoDB。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM