2011-03-14 17 views
0

隱藏產品組於是我有了一個結構是這樣的數據庫:如何處理這個簡單的問題 - 從用戶

[user_table] user_id, name, active 
"john", "John S. Smith", true 

[group_table] group_id, description, active 
"abc", "test group", "true" 
"cba", "second group", "true" 
"bca", "third group", "true" 

所以現在我想隱藏「約翰」,「ABC」組。 我使用字段user_id和group_id創建了一個名爲「hide_group」的新表。我插入適當的值,一切都很好。但它不是很好的優化。如果我有20個用戶和數百個組?那將意味着成百上千的新紀錄。 有沒有一種更優化的方式與關係做到這一點?我正在使用MyISAM引擎,如果我記得,我不能使用外鍵。 我正在閱讀mysql文檔,但它仍然對我很模糊。也許有人可以指出我正確的方向?

編輯,我的表結構是這樣的:

[group] 
group_id, group_description 

[group_hide] 
group_id, user_id, hide 

我想選擇是在「組」表中的所有羣體。除了隱藏在group_id表內的那些外。我怎樣才能做到這一點?現在我可以讓它只選擇group_hide表中的所有記錄(這不是我所需要的),或者只選擇group內的所有記錄,忽略group_hide中的所有記錄。我希望不要選擇應該隱藏的組,但其他所有組件都應該可見。

+0

MyISAM不執行外鍵,因此不會級聯刪除。但你加入的密鑰絕對是外鍵。除非你的表具有'FULLTEXT'索引或者你有一些特殊的數據庫備份需求,否則可能需要切換到Innodb。 – dnagirl 2011-03-14 13:01:03

回答

1

如果您可以以某種方式對用戶及其組的可見性進行分類,則可以考慮定義某些「角色」。因此,這些關聯將介於角色(稱爲「管理員」或「默認」或「主持人」)和組之間以及角色和用戶之間。

E.g.您將創建一個表roles用一個ID和一個name,表roles_users 2列role_iduser_id和另一個表hidden_categories_roles 2列hidden_category_idrole_id。不要忘記在兩個表中的兩列上都加上索引來加速查詢。

如果用戶如此不同以至於無法對其進行分類,則您的方法是正確的,您應該簡單地在新表的兩列中定義索引以加快查詢速度。

+0

嗯好的。當我嘗試使用「SELECT item.group_id,hide_group.hide FROM item,hide_group WHERE hide_group.user_id ='john'AND hide_group.hide ='true'」來選擇記錄時「 它選擇每個項目並顯示hide列爲true。 。我怎樣才能使它只顯示有真旗幟的物品? – WraithLux 2011-03-14 14:53:34

+0

通過這個查詢,你正在做一個隱含的CROSS JOIN,意思是對於「item」中的每一個條目,你都用匹配條件查詢「hide_group」中的所有行(不僅僅是匹配項目的組),這顯然不是你想要的。我建議您閱讀了不同種類的JOIN以及如何執行它們。這裏有一個更正的查詢可以幫助你開始:「SELECT item.group_id,hide_group.hide FROM item INNER JOIN hide_group ON hide_group.group_id = item.group_id WHERE hide_group.user_id ='john'AND hide_group.hide ='true'」 – 2011-03-14 15:15:56

+0

順便說一下,對於布爾列(true或false),您應該考慮使用TINYINT(1)作爲數據類型並將其設置爲1或0.不推薦使用'true'和'false'字符串。 – 2011-03-14 15:19:25

相關問題