[英]mysql database normalization question
這是我的3張桌子:
表1-存儲用戶信息並且具有唯一數據
表2-存儲地點類別,例如多倫多,紐約,倫敦等,因此這也是唯一的
表3-信息重復。 它存儲用戶去過的所有地方。
這三個表通過以下ID鏈接或聯接:
表1具有“ table1_id”
表2具有“ table2_id”和“ place_name”
表3具有“ table3_id”,“ table1_id”,“ place_name”
我有一個界面,管理員可以看到所有用戶。 用戶旁邊是“編輯”按鈕。 單擊該編輯按鈕,您可以在具有多個“位置”下拉框的表單字段中編輯特定用戶。
如果管理員編輯用戶並為該用戶添加1個“位置”,我將使用php插入該信息。 如果管理員決定取消選擇1個“位置”,我是否將其刪除或將其標記為打開和關閉? 管理員是否決定為用戶選擇2個“地點”? 更改第一個“位置”,並添加其他“位置”。 我的桌子會持續增長嗎?我會得到多余的信息嗎?
謝謝。
表1和2聽起來正確。 表3不應包含place_name。 相反,您應該同時具有對table1_id和table2_id的外鍵引用(可以選擇保留table3_id)。 這使table3成為連接表 。
當您要為用戶刪除位置時,您將在table_3中刪除一行(僅此而已)。 添加位置時,首先檢查表1中是否存在。如果不存在,則將其添加到表1中。然后,在表3中添加一行。應進行更改(例如,在用戶界面中重命名用戶)。被分解為刪除然后添加。
這樣可以避免多余的信息。
處理方式取決於應用程序的需求。 例如,您需要知道某個地方何時被刪除嗎?
最簡單的方法是,每當為用戶更新場所時,jsut都將其刪除,然后重新添加所選擇的場所。
因此,如果取消選擇所有地點並添加一個新地點,則看起來像:
delete from UserPlace where UserID = 42;
insert into UserPlace (UserID, PlaceID) values (42, 123);
刪除記錄可能會影響MySQL中的並發插入 ,因此擁有on / off列而不是執行DELETE
可能是以后的優化。
您可以在多列上設置UNIQUE
索引,以確保對於任何給定的人員/位置組合,僅存在一條記錄。 INSERT … ON DUPLICATE KEY UPDATE
語法可以簡化這種情況下的查詢,尤其是在刪除位置后重新啟用位置時。
使用此設置,您將需要一些維護腳本,該腳本每天/每周/無論運行什么,以DELETE
“關閉”記錄,然后DELETE
OPTIMIZE TABLE
。
因此,這是一種方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.