首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >帮助理解DB架构/设计

帮助理解DB架构/设计
EN

Stack Overflow用户
提问于 2011-06-26 12:21:01
回答 4查看 121关注 0票数 0

你好,我面对的是.

两个DB表(mysql myisam表-没有外键约束)“主表”和“子表”。“子”db表中的行使用parent_id *列*引用“主”表中的一行(1:M)。

问题是parent_id列有2种“类型”的值:

  • 非零值引用“主”表
  • 中的一行-零值意味着该行没有引用“主”表。在这种情况下,parent_id列中值为零的行“实际上意味着”其他的东西,=>表示不同类型的数据(存储在同一个表中?)将苹果和桔子放在同一张表中,而这两个表最好放在不同的表中)

我很困惑。这仅仅是一个糟糕的数据库设计吗?使用列中用于引用另一个表中的“父行”的不同值来区分DB表中的“哪些行”是一种常见的做法吗?

如果您不感到困惑,也可以帮助您,请执行:)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-06-26 12:46:04

当您讨论表中的哪些行“实际意思”时,您将从逻辑数据建模过渡到概念数据建模,即数据的语义。通常,在一个表中存储两种不同类型的行的实际意义是个坏主意。

从速度的角度来看,这是个坏主意,因为大多数查询都需要额外的磁盘io来清除与当前查询无关的行。

从生成无bug代码的角度来看,这是个坏主意,因为它忘记了清除不相关的行,您会得到错误的结果。

从灵活性的角度来看,这是个坏主意,因为当需求发生变化时,不适当地绑定在一起的数据更难更改。

设计不好。

尽管如此,在设计良好的数据库中还有可选的FK字段。在这种情况下,选择退出关系的行包含空,而不是单元格中的零。然而,即使在这种情况下,其余列的语义也不受关系是否存在或不存在的影响。

票数 2
EN

Stack Overflow用户

发布于 2011-06-26 12:28:37

您通常会使用一个可空的外键约束来执行此操作。将一列用于两种不同事物的想法通常是个坏主意。可空外键约束强制非空值具有引用完整性,但仍然允许子表中的孤儿。

没有外键的问题是,有人可以将值插入到主表中没有对应行的子表中(或稍后删除主表中的引用行)。

这不是一个好的设计--数据库应该对自己的完整性负责。

票数 2
EN

Stack Overflow用户

发布于 2011-06-26 12:27:24

我没有足够的信息来说明这是否是一个糟糕的设计。

在我看来,这是一对多的关系。

您对CHILD列中引用MASTER的两个不同值感到苦恼。这听起来像是我常用的表示可空外键的方法。它说,您可以拥有一个不属于任何CHILD行的MASTER行。任何示例都是将一个或多个STUDENT行分配给SCHOOL行的学校的数据库。

来自STUDENT表的引用可以为null;毕竟,我们不会杀死/删除碰巧未分配到学校的STUDENT,对吗?

我会问,为什么不使用空值来完成这一任务。您确定没有看到数据库表示null的方式吗?如果有人发明了他们自己的方法,并且出于任性或无知而绕过了无效,那就说这是一个糟糕的设计。

两个表都必须有主键。如果子表引用的主列是主表的主键,这是最好的。如果不是,就说这是个糟糕的设计。

更新:我可以想到一个历史原因,可以解释它。

在ISAM引擎出现之前,较早版本的MySQL没有强制执行引用完整性。您的模式可能是在ISAM之前开发的,因此开发人员决定必须自己管理引用完整性。如果您已经更新到ISAM,那么模式可能没有随它一起移植。

如果我对历史的假设是错误的,请忽略这个想法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6483861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档