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