2014-07-20 25 views
1

最近我發現自己設計了一個數據庫。該數據庫是由幾個表(InnoDB的)的:MySQL數據庫:標準化/查詢VS加入/唯一索引有多遠

表1:國家ID,COUNTRY_NAME

表2:ID,CITY_NAME,countryid

表3:用戶id,cityid,A,B,C,D,E

用戶表,A,B,C,dË是用戶,其中特徵一個如果你cityid必須是唯一的結合它的一些特點,這就是爲什麼我創建這些2列的唯一索引:

CREATE UNIQUE INDEX idx_user ON Users(cityid , A); 

其餘列B,C,d和E其他用戶特性(例如髮色,身高,體重等),作爲你明白,無線將在桌上重複(頭髮顏色=黑色,或重量= 75公斤)。

同時countryidcityid配置爲上更新外鍵和DELETE CASCADE。

搜索將基於cityidA列。一個下拉菜單選擇城市(因此cityid)和一個文本框插入特徵A然後點擊搜索按鈕。

我的問題是:

  1. 用戶表,我有在同一列(列B,C,d和E)重複的數據。這是針對2NF。我是否必須爲每個這些列創建一個單獨的表,然後將這些表中的每個表的外鍵分配給用戶表以實現2NF?

    表B(ID,Bchar)

    表C(ID,CCHAR)

    表d(ID,Dchar)

    表E(ID,Echar)

    用戶( ID,cityid一個,投標,CID,DID EID)

  2. 對於時間i將不使用的列B,C,dË作爲搜索數據,僅使用cityid搜索搜索後顯示它們。如果(未來)我決定我需要顯示用戶的所有結果cityid並且有黑色頭髮,現在我在設計數據庫時需要記住什麼?

  3. 一方面我們有DML(INSERT,UPDATE,DELETE)和另一方面quering(SELECT)。 DML在標準化數據庫上運行速度更快,並在非規格化數據庫上運行。有一箇中間解決方案嗎?

  4. 將上面創建唯一索引,足以確保在列中的數據的組合獨特cityid一個?我是否需要使用JavaScript或更好的PHP進一步限制它?

  5. 多個查詢VS連接: 規範化數據庫將需要多個查詢或帶連接的單個查詢。在這種情況下,其中「從馬德里用戶與特性的用戶搜索」:

    一)多個查詢:

    我)去表,找到馬德里的標識(例如,ID = 2)

    ⅱ)鑑於馬德里ID和特性A的輸入端,去用戶表和SELECT * FROM用戶WHERE cityid = 「2」 和A = 「特性」;

    B)INNER JOIN:

    i) SELECT City.city_name, Users.B, Users.C FROM City INNER JOIN Users ON Users.cityid = City.id; 
    

    哪一個,我應該更喜歡哪個?

在此先感謝。

+0

選中此項以獲取有關選擇主鍵或唯一索引的信息http://stackoverflow.com/questions/487314/primary-key-or-unique-index – user1613360

+0

您需要給出1.所有列集合都是唯一的,但是包含沒有更小的這樣的集合(鍵),以及2.可以放在他們自己的表中並且回到原始(JD)的所有列集合。例如,「在同一列(列B,C,D和E)重複數據」尚不清楚。 – philipxy

回答

0

你的表已經在2NF 2NF.The條件是不應該有部分dependency.For例如允許把你的usersuser-id是主鍵和另一主鍵更合適的調用candidate key(cityid,A)與您可以唯一地表示表中的一行。如果cityid或A單獨足以唯一地檢索B,C,D或E,則表格不在2NF中,但在您的情況下,需要同時使用(cityid,A)來檢索唯一記錄,因此它已經標準化。

注:

你的表是不是在3NF 3NF.The條件不傳遞dependency.Let的區分用戶表這裏用戶ID是主鍵,你可以得到一個唯一的(cityid,A),與對那麼你又可以得到一個唯一的(B,C,D,E)記錄,其中(cityid,A)是從userid獲得的。簡而言之,如果A-> B和B-> C間接A-> C稱爲傳遞依賴關係,它存在於你的用戶表中,因此它不適合3NF。

+0

因此,它對數據庫更好地遵循我在第一個問題中描述的內容?或者,如果沒有,我如何去第三NF我的例子? – christostsang

+0

不,你不需要去3NF 2NF是罰款。任何轉換爲​​3NF你應該拆分用戶表爲table1(id,cityid)和table2(id,A,B,C,D,E)。 – user1613360

+0

但是,如果我拆分表,我不能有UNIQUE INDEX(cityid,A)..無論如何,我擔心的原因是因爲我不想有相同的數據在B,C,D,E列中重複..將它們分解成單獨的表格並使用FK將它們與Users表格鏈接起來,這可能是一個解決方案,但同一張表格上的5個FK(來自B,C,D,E表格和4個城市表格中的4個)似乎很多。我不知道這是否會給數據庫帶來問題 – christostsang