与其他实体有随机关系的实体
Posted
技术标签:
【中文标题】与其他实体有随机关系的实体【英文标题】:Entity having random relations with other entities 【发布时间】:2017-01-30 12:39:38 【问题描述】:我有一个案例,一个实体(职业)可能与其他实体有关系,也可能没有关系。
我可能有一个用户的职业是家政,而另一个用户的职业是烹饪,但我们必须指定他在哪些国际厨房做饭,所以我们有 X 是西班牙和亚洲厨房的厨师,Y是在管家。
与其他实体的条件关系取决于专业的业务类型。
我有以下表格:
-- 用户:ID,姓名,...
-- 职业:Id、职称、linked_entity_name
-- User_Profession: user_id, professional_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
【问题讨论】:
User & Profession
之间的关系基数是多少?如果1 to many
,那么我认为最好的做法是像您一样保留一个单独的表格。
是的,一个用户可以拥有多个职业@1000111
这是什么意思:如果该专业未与实体关联,则 User_Profession 表中的实体 id 将为零。
^ 这意味着我希望它没有相交行
@Drew 在用户做家务的情况下,他在表 user_profession 中的行将列 entity_id 值为零
【参考方案1】:
几分钟前,我用相同的answer 回答了一个问题,我将在此处提供。
简而言之,根据需要创建一个或多个表格来包含每个职业的详细信息。创建一种交集表,将每个用户与其职业联系起来。当然,不同职业的职业数据会包含在不同的表中,所以交集表的职业侧不能直接引用职业数据表。
所以...将 FK 放置在专业表中,并使用专业指示符来引用交叉表的专业侧,以保持数据完整性。详情见以上链接。
【讨论】:
我一直在分析你提出的方法,我这里有一点不同的情况,客户总是与一个专业相关联..这在你的架构中会放在哪里?此外,如果用户正在搜索所有西班牙厨师的客户,它在性能方面的效率如何?在您对业务需求进行小幅审查后,您能否给出一个适合我的案例的详细示例以获取所有详情? 如果您有其他要求,请发布,以便我们都有机会回答。 与问题相同,但重点是一个客户可能有一个没有详细信息的职业(例如家政服务),另一个客户可能是西班牙和亚洲厨师。我需要考虑这些情况.此外,搜索似乎需要大量查询......或者您认为我们可以使用此 ERD 获得良好的性能? 可能有没有细节的职业。混合交集表包含一个职业指标。如果它包含“H”(管家),则您知道没有其他详细信息并且 ID 为空。如果它包含“C”(Cook),则您知道 CookDetails 表中有由 ID 字段中的值标识的详细信息。 CookDetails 表本身可以规范化为多个表——这没有区别。要搜索 Asian Cooks,请从详细信息表开始搜索,然后转到客户表以获取该数据。应该很快。以上是关于与其他实体有随机关系的实体的主要内容,如果未能解决你的问题,请参考以下文章
每组随机采样,制作一个新的数据框,重复直到组内的所有实体都被采样
在 CoreData 和 EXC_BAD_ACCESS 信号中插入实体