与其他实体有随机关系的实体

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,请从详细信息表开始搜索,然后转到客户表以获取该数据。应该很快。

以上是关于与其他实体有随机关系的实体的主要内容,如果未能解决你的问题,请参考以下文章

Id 列来自其他表 JPA 实体

每组随机采样,制作一个新的数据框,重复直到组内的所有实体都被采样

返回实体中的随机属性(核心数据)

在 CoreData 和 EXC_BAD_ACCESS 信号中插入实体

过滤多对多关系,其中一个实体与所有其他实体有关系,而不仅仅是一些实体

CoreData - 如何创建 fetchrequest 以获取随机属性值数组