2013-08-20 107 views
0

我建立一個PHP應用程序預填與客戶端數據的第三方PDF帳戶的形式,我被陷在數據庫設計。MySQL的規範化或反正規化

目前的形式有大約70場,這似乎是太多的設立爲單獨的列,尤其是一些(即公司/信託信息)是不相關的根據客戶需要的帳戶類型。

我試圖正常化,但好像會有很多的連接,並且還需要的東西像多個地址幾個子查詢。

這還意味着大量額外的查詢來檢查行是否存在或更新時,以確定腳本是否需要執行INSERT,DELETE或UPDATE,而如果它全部在一行中,它基本上每次只是一個更新。

不知道這是否有助於但這裏是大多數字段列表:

ID,ACCOUNT_TYPE,account_phone,ACCOUNT_EMAIL,account_designation,account_adviser,account_source,account_complete, account_residential_unit_number,account_residential_street_number,account_residential_street_name,account_residential_street_type ,account_residential_suburb,account_residential_state,account_residential_postcode, account_postal_unit_number,account_postal_street_number,account_postal_street_name,account_postal_street_type,account_postal_suburb,account_postal_state,account_postal_postcode, individual_1_ti TLE,individual_1_firstname,individual_1_middlename,individual_1_lastname,individual_1_dob,individual_1_occupation,individual_1_email,individual_1_phone, individual_1_unit_number,individual_1_street_number,individual_1_street_name,individual_1_street_type,individual_1_suburb,individual_1_state,individual_1_postcode, individual_2_title,individual_2_firstname,individual_2_middlename,individual_2_lastname,individual_2_dob,individual_2_occupation,individual_2_email,individual_2_phone, individual_2_unit_number ,individual_2_street_number,individual_2_street_name,individual_2_street_type,individual_2_suburb,individual_2_state,individual_2_postcode, company_name,company_date, company_unit_number,company_street_number,company_street_name,company_street_type,company_suburb,company_state,company_postcode, trust_name,trust_date, settlement_bank,settlement_account,settlement_bsb

最,這將需要處理的是20萬左右的應用程序,而一旦數據在數據庫中,也不會經常變化,如果有的話 - 不確定這是否相關?

所以真的只是想找出該怎麼設計這個最聰明的方式,即使它只是一個名字,或者進一步的研究課題。

回答

1

一般來說,你可以把一個數據庫分成兩大類:

  1. OLTP系統

    聯機事務處理系統通常寫密集型即大量更新的數據相比的讀取。該系統通常是每天所有範圍,即數據採集的企業用戶使用應用程序的一天,管理等,這些數據庫通常歸到了極點,然後某些士氣低落的在某些方面的性能提升。

  2. OLAP/DSS系統:

    聯機分析處理是數據庫通常大型數據倉庫等的系統。用於支持分析活動,如數據挖掘,數據立方體等。通常,這些信息由比OLTP更有限的一組用戶使用。這些數據庫通常非常規範化。

請點擊這裏查看這些和主要區別的簡短描述。 OLTP VS OLAP

關於你的INSERT/UPDATE/DELETE積分請閱讀MySQL ON DUPLICATE KEY UPDATE聲明,以便您輕鬆解決該問題。在大多數數據庫系統中它被稱爲MERGE操作。

現在我不明白你爲什麼擔心JOINS。我已經有了擁有數百萬(500 000 000+)行的表格,並且與其他表格的大小相同,查詢速度非常快。所以設計一個數據庫來消除連接並不是一個好主意。

我的建議是:

如果設計一個OLTP系統正常化儘可能然後denormalise在需要的地方,以提高性能。對於一個OLAP系統來看看星型模式等,甚至不用先正規化它。哦,大多數OLAP系統通常使用OLTP系統作爲數據源。

1

通常我規範化,然後denormalise性能。然而

如果我沒有太多的驗證做如有效的地址,複製indivual

我不想重複使用的部分數據爲形式的另一個版本,例如選擇現有的個人,姓名和地址等

而且我不想去分析它如找到所有提到弗雷德·布洛斯

和我的用戶樂於接受所有進入這一種形式的(我不會)

然後我會去德從開始規範化。

事情就是如果你規範化,那麼如果需要非規範化是相當平凡和低風險的,規範化非規範化數據通常意味着重複數據刪除,這可能是非常痛苦的數據和設計明智的。

0

我發現非規範化的數據非常痛苦,在非常基礎的層面上工作。如果我想要了解居住在格魯吉亞的人數,那該怎麼辦?在你的非規範化結構中,我必須計算ind_1_state = GA或ind_2_state = GA的位置。

這不算太壞,我猜,但對於誰看到了正常化提供的查詢容易程度的人來說,這是相當痛苦的。

規範化建立了越來越複雜的查詢基礎。沒有它,你會發現越來越難實施更豐富的數據分析。

規範化還爲您的數據庫提供了完整性和一致性的基礎。如果您在一個地方(一列)中發生了特定事件(州名縮寫)的所有事件,則可以輕鬆檢查並限制這些值,以避免不存在不存在的代碼。

正常化的基本原理不斷變化,但我希望我能找到一些沒有問題的人。

0

這並不是一件容易的事 - 你現在所擁有的只是一個名詞湯,你只需將它放在一個表格存儲鞋盒中,然後在每行的開頭粘上一些ID。

創建某種模式。如果這更像是一個OLAP - 並且您決定採用星型模式 - 它將具有2-5 NF的維度和2-6 NF的事實。對於OLTP(或不同的倉庫模型),目標是BCNF-6NF。

我會爭辯說,你甚至沒有1NF在這裏,粘合該ID在開始時不計算爲防止重複。因此,即使你想要,你也不能從這一點去規範化 - 好吧,也許你可以在某處放置一些逗號分隔的列表,以使事情絕對不在1NF中。

連接是關係數據庫的功能,所以不用擔心。

1

標準化你的輸入,使輸出去歸一化。意味着,爲了報告,將數據提取到像Mongo這樣的非規範化格式,並將其用於查詢。或者,創建某種類型的彙總。我發現,使用大型數據集可以從輸入數據中提取報告數據以獲得最佳效率。