我不知道该怎么称呼这篇文章,但这是我的问题:
我有两个表:Online_Module&Offline_Module这两个表用于我的程序,以确定学习模块是否必须在线或在现场.
现在我也有一张叫做的桌子Academy.一个Academy由许多模块组成.为此,我想创建以下子表:Academy_has_Module
这就是问题所在.因为Online_Module并且Offline_Module不在同一个表中,我的其中一个值Academy_has_Module将永远存在null
以下是一些显示这些表的构建的图片:

如您所见,其中一个值将始终如一null.我想知道,在这种情况下最佳做法是什么?
1)创建一个表模块,为在线和离线模块保持字段commong:
id INT,
description
material
status
category
Run Code Online (Sandbox Code Playgroud)
2)然后保留离线/在线模块表(编辑:减去字段 - 除了id字段 - 你现在保留在Module表中),但是让他们FK引用新的Module表,使用Module表作为中间链接.
编辑: 现在,不要用很多东西来压倒你,但是你自己有几个问题需要问答,即: - 模块只能离线/在线吗? - 如果是的话,我想在数据库中100%强制执行吗?
因为使用我的解决方案,您可以拥有一个模块,并通过多个Offline/Online模块引用它.有办法解决它,但我认为它们会远远超出你的要求,我只是提到它,所以你知道..
至于获取信息(可能不是最好的,但这是我现在的水平,如果有人知道更好,请随时教我一个新的技巧:)).*注意:丑陋的编码,对于完整的编码风格太累了: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
Run Code Online (Sandbox Code Playgroud)
但是现在,根据我的理解,如果你在Module表中添加了一个ModuleType,ORM框架(我真的没那么说实话,所以没有第一手经验),可以使用它来返回一个正确的对象类.但这更深入到您的项目中使用的整个架构和技术,并且超出了这个问题的范围,甚至超出了我的实际经验.
EDIT2: 好的,我还想到了另外一件事:将在线/离线模块表结构更改为某种方式是不合理的?例如在线模块: - 可以有一个导师/负责人,因为weel-可以打开 - 到datetime -offline模块没有名字? - 在线模块的位置即'在线',只是将表与ModuleType合并 - 约束或FK到枚举表(不确定正确的术语是英语).也许有点强迫,但(再次,这很大程度上取决于总体要求,我从来没有看到即使在一次迭代中添加一个简单的表,它总是影响某些东西,它在设计内部传播)可以让你的生活变得简单.有时,最好每个记录浪费几个字节的空间,然后试着太可爱并且在后面的路上留下一点点.
祝你今天愉快