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

标签 mysql database performance database-design relational-database

我有一个案例,一个实体(专业)可能与其他实体有关系,也可能没有关系。

我可能有一个用户以家政为职业,而另一个用户以 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/

相关文章:

python - 更高效/时尚的代码来转换数据结构

batch-file - 缓慢处理利用 findstr 的 for 循环

php - JSON 到 MySql 使用 PHP

mysql - 如何保证嵌套选择查询的效率?

sql - 更改两小时之间耗时的输出格式

sql - 从每个 id 中获取最后一行并将其与计数进行比较

MySQL NDB 集群无缘无故变慢

一个简单数据库的 C#-mySQL 连接程序,具有 1 个执行基本操作的表

php - CAKE-PHP如何在MYSQL表中保存动态数组

php - 使用一张表将不同的 MIME 类型上传到数据库