gpt4 book ai didi

mysql - 做表集合时的sql正确做法

转载 作者:行者123 更新时间:2023-11-29 04:20:51 24 4
gpt4 key购买 nike

我不确定如何称呼这篇文章,但这是我的问题:

我有两个表:Online_Module & Offline_Module我的程序中使用这两个表来确定学习模块是在线学习还是现场学习。

现在我还有一个表叫Academy .一个Academy由许多模块组成。为此,我想创建以下子表:Academy_has_Module

问题就在这里。因为Online_ModuleOffline_Module不在同一个表中 我的值之一 Academy_has_Module永远是null

这里有一些图片显示了这些表的构建:

Online_offline Academy_has_Module

如您所见,其中一个值将始终为 null .我想知道,在这种情况下,最佳做法是什么?

最佳答案

1) 创建一个表模块,保存在线和离线模块的通用字段:

id INT,
description
material
status
category

2) 然后保留离线/在线模块表(编辑: 减去字段 - 除了 id 字段 - 你现在保留在模块表中),但让它们 FK 引用新模块表,使用模块表作为中间链接。

编辑:现在,不要用很多东西让你不知所措,但有几个问题你必须自己问答,即:- 模块只能离线/在线吗?- 如果是,我想在数据库中 100% 强制执行吗?

因为使用我的解决方案,您可以拥有一个模块并让多个离线/在线模块引用它。有很多方法可以解决它,但我认为它们会远远超出你的要求,我只是提到它,所以你知道..

关于获取信息(也许不是最好的,但这是我目前的水平,如果有人知道更好,请随时教我一个新技巧:))。 *注意:丑陋的编码,完整的编码风格太累了:D *:

select *, case 
when OffM.Id is null and OnM.Id is null then 'No module!'
when OffM.Id is not null and OnM.Id is not null then 'Too many modules!'
when OffM.Id is null and OnM.Id is not null then 'Online module!'
when OffM.Id is not null and OnM.Id is null then 'Offline module!'
end --probably a different, better way to compare?
from Academy_has_Module as AHM
join Module as M
on Academy.Module = M.Id
left join OfflineModule as OffM
on OffM.ModuleID = M.Id
left join OnlineModule as OnM
on OnM.ModuleID = M.Id

但是现在,据我所知,如果你在 Module 表中添加了一个 ModuleType,ORM 框架(老实说我并没有那么多地使用它们,所以没有第一手经验),可以使用它来返回一个对象正确的类。但这对您项目中使用的整个架构和技术要深入得多,超出了这个问题的范围,甚至超出了我的实际经验。

编辑 2:好的,我又想到一件事:以某种方式将在线/离线模块表结构更改为相同是否不合理?例如在线模块:- 可以有一个导师/负责人作为 weel- 可以从 - 到日期时间开放-离线模块没有名字?-在线模块的位置将是“在线”并将表与 ModuleType 合并在一起 - 约束或 FK 到枚举表(不确定英语中的正确术语是什么)。也许有点强制,但是(同样,这在很大程度上取决于总体需求,我从来没有见过在一次迭代中添加一个简单的表格,它总是会影响某些东西并在设计中传播)可以让你的生活变得简单.有时,最好在每条记录上浪费几个字节的空间,然后试图表现得过于可爱而在后面被咬一口。

祝你有个愉快的一天

关于mysql - 做表集合时的sql正确做法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24609030/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com