3

我有一個實體(職業)可能與其他實體有關係的情況。與其他實體有隨機關係的實體

我可能有一個用戶有家務管理作爲一個職業,而另一個用戶有烹飪作爲一個職業,但我們必須指定他在哪個國際廚房烹飪,所以我們有X是西班牙和亞洲廚房的廚師, Y在管家。

與其他實體的條件關係取決於行業的業務類型。

我有以下表格:

- 用戶:ID,姓名,...

- 職業:ID,標題,linked_entity_name

- User_Profession:USER_ID,profession_id, entity_id

如果行業沒有鏈接到實體,則表User_Profession中的實體ID將爲零。

這種方法在網站表格標準化,性能和數據搜索方面是否有效?

實體可能有或沒有關係的最佳實踐是什麼?

CREATE TABLE `user` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `fullName` varchar(100) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE `profession` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `title` varchar(100) NOT NULL, 
    `linked_entity_name` varchar(100) NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE `user_profession` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `user_id` int(11) NOT NULL , 
    `profession_id` int(11) NOT NULL , 
    `entity_id` int(11) NOT NULL DEFAULT 0, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE `kitchen` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `kitchen_name` varchar(100) NOT NULL, 
    `kitchen_origin` varchar(100) NOT NULL, 
    `kitchen_desc` varchar(100) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

SQLFiddle:http://sqlfiddle.com/#!9/ece75

+0

'用戶&職業'之間的關係的基數是什麼?如果「一對多」,那麼我認爲最好的做法是像你一樣保留一張單獨的桌子。 – 1000111

+0

是的,用戶可以擁有多個專業@ 1000111 – KAD

+0

這意味着什麼:*表中的實體ID將爲零User_Profession,以防專業鏈接到實體* – Drew

回答

0

分鐘前,我回答的問題具有相同answer我會在這裏提供。

簡而言之,根據需要創建一個或多個表以包含每個行業的詳細信息。創建一種交叉表來將每個用戶與他們的職業聯繫起來。當然,行業數據將包含在不同職業的不同表格中,因此交叉表的專業側不能直接引用行業數據表。

因此......將專業表格中的FK放在專業表格中,並使用專業指示符來引用專業人士以維護數據的完整性。上面的鏈接中的詳細信息。

+0

我一直在分析你提出的方法,在這裏我有一些不同的情況,客戶總是和職業聯繫在一起。此外,如果用戶搜索西班牙廚師的所有客戶,它在績效方面的效率如何?您能否給我一個詳細的例子,在對業務需求進行小範圍的審查以找到所有人細節? – KAD

+0

如果您有其他要求,請發佈,以便我們都有機會回答。 – TommCatt

+0

它與問題相同,但重點是客戶可能沒有細節(如家務管理),另一個客戶可能是西班牙和亞洲廚師。我需要考慮這些情況。此外,這似乎是一個沉重的查詢需要搜索..或者你認爲我們可以取得良好的表現與這個ERD? – KAD