我有一个案例,一个实体(专业)可能与其他实体有关系,也可能没有关系。
我可能有一个用户以家政为职业,而另一个用户以 cooking 为职业,但我们必须指定他在哪些国际厨房做饭,所以我们有 X 是西类牙和亚洲厨房的厨师,Y是客房服务。
与其他实体的条件关系取决于该行业的业务类型。
我有以下表格:
-- 用户:Id, Name, ...
-- 职业:Id, title, 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
最佳答案
几分钟前我用相同的 answer 回答了一个问题我会在这里提供。
简而言之,根据需要创建一个或多个表格来包含每个职业的详细信息。创建一种交叉表,将每个用户与其职业联系起来。当然,不同的职业会在不同的表中包含职业数据,所以交集表的职业侧不能直接引用职业数据表。
所以...将 FK 放在职业表中,使用职业指示符引用回交集表的职业侧,以保持数据完整性。上面链接中的详细信息。
关于mysql - 与其他实体有随机关系的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39630504/