2010-04-09 135 views
1

是我的3個表:MySQL數據庫規範化問題

表1 - 存儲用戶信息,它具有獨特的數據

表2 - 存儲類的地方,如多倫多,紐約,倫敦等因此這也是獨特的

表3 - 具有重複的信息。它存儲了用戶所有的地方。

3個表是鏈接或加入了由這些ID:

表1具有 「table1_id」

臺2具有一個 「table2_id」 和 「PLACE_NAME」

表3具有「 table3_id「,」table1_id「,」place_name「

我有一個管理員可以看到所有用戶的界面。在用戶旁邊是「編輯」按鈕。點擊該編輯按鈕可讓您在表單字段中編輯特定用戶,該表單字段具有「地點」的多個下拉框。

如果管理員編輯用戶併爲用戶添加1個「位置」,我使用php插入該信息。如果管理員決定取消選擇該「1個位置」,我是否將其刪除或將其標記爲打開和關閉?如果管理員決定爲用戶選擇2個「場所」,怎麼樣?更改第一個「地點」並添加額外的「地點」。我的桌子會不斷增長,我會有多餘的信息嗎?

謝謝。

回答

3

表1和表2聲音正確。表3不應包含place_name。相反,您應該有對table1_id和table2_id的外鍵引用(您可以選擇保留table3_id)。這使得table3 a junction table

當你想刪除一個用戶的地方,你會刪除table_3中的一行(就是這樣)。添加地點時,首先檢查它是否存在於表1中。如果不是,則將其添加到表1.然後,向表3添加一行。更改(例如,爲用戶重命名UI中的地點)應該分解成刪除然後添加。

這樣可以避免冗餘信息。

0

你如何處理這取決於你的應用程序的需求。例如,你需要知道某個地點何時被刪除?

最簡單的方法是,無論何時正在更新某個用戶的位置,只要刪除所有這些位置,然後重新添加所選位置即可。

所以,如果被取消選擇所有的地方和一個新添加的,它看起來像:

delete from UserPlace where UserID = 42; 
insert into UserPlace (UserID, PlaceID) values (42, 123); 
+0

謝謝,我喜歡你和Matthew Flaschen的迴應! – NULL 2010-04-09 15:25:43

0

刪除記錄有可能影響concurrent inserts在MySQL,所以有開/關列,而潛在的比做一個DELETE可以成爲一個優化的道路。

您可以在多列上設置UNIQUE索引,確保只有一條記錄存在於任何給定的人員/位置組合中。在這種情況下,INSERT … ON DUPLICATE KEY UPDATE syntax可以簡化查詢,特別是當某個位置在刪除後重新啓用時。

使用此設置,您需要一些維護腳本,該腳本每天/周/每天運行至DELETE「off」記錄,然後是OPTIMIZE TABLE

所以,這是一個辦法。