当前位置: 首页 > 知识库问答 >
问题:

mySQL中“组合”查找表相对于单个查找表的缺点

姜凯风
2023-03-14

仅使用一个组合查找表(mySQL数据库)来存储表之间的“链接”比使用单独的查找表有大的缺点(可能在查询速度等方面)吗?我之所以这么问,是因为在我的项目场景中,我最终会得到超过100个单独的查找表,我认为设置和维护这些表将会有很多工作。但为了更简单地举例,这里是一个仅包含4个表的简化场景:

表:教师

表:学生

表:类

表:languageSpoken

=================================================================================

表:student_teacher

表:student_class

表:student_languageSpoken

======VS一个组合查找表(带有一个辅助表)=====

帮助器表:allTables

表:lookupTable

共有2个答案

孔俊友
2023-03-14

查找表通常是静态的,因此不应该有太多的维护开销。但是,如果您更新了查找数据,那么现在必须管理单个查找表的行子集的生命周期,这可能会变得棘手,而不是在新数据可用时截断表。如果您的查找表有不同的模式,并且列必须为null,因为它们应用于给定的“类型”行,那么我会非常小心。您可能无法实现正确的外键。如果您碰巧使用了错误的id,就会得到一个不合理的值。这些帮助您保持数据的一致性(在生产系统中)。如果这是一个学校项目,特别是一个数据库类,你将会因为没有使用教科书的规范化而受到惩罚。

上官培
2023-03-14

您的第二个查找模式是完全没有用的。

您可以通过表的名称/索引引用表。但是您不能直接使用这个关系(tablename不能参数化),您需要构建条件连接表达式或者使用动态SQL。这比较慢。

您的查找表是可反转的,即相同的引用可以通过两种方式写入。当然,您可以添加CHECK约束,如CHECK table_A (另外,它避免了自引用),但这再次降低了性能。

您的查找不会阻止不存在的关系(例如,类和语言不相关,但不阻止为这种关系创建行)。同样,附加的约束和性能下降。

还有更多的缺点...但我懒得一一列举。

另一点非常重要:确保引用完整性的外键约束不能用于“组合查找”方法。它们需要用复杂且容易出错的触发器来模拟。总体而言,“组合查找”方法只是一个可怕的想法。-粘性钻头

有一个规则--非关系的关系必须分开。

在第一种方案中--一个学生可以同时在多个班级学习吗?如果不需要,则不需要student_class查找表,而class_idstudent表中的属性。

 类似资料:
  • 问题内容: 假设我有一个付款表,如下所示: PaymentID INT,CustomerID INT,Value INT,PaidOn DATE 我想查询每个客户的最高付款额。是否可以使用单个SQL查询来避免不必要地挖掘我不感兴趣的每一行-或更糟糕的是,为每个客户运行一个查询? 到目前为止,我能想到的最好的方法是: 从Payments GROUP BY CustomerID中选择CustomerI

  • 问题内容: 我有下表,其中包含每15分钟从几个不同的设备读取的值: 我想在表中找到每个月在给定月份中没有条目的所有设备的所有差距。对于上表,结果应该是这样的: 该表大约有35000台设备和1亿个条目。 这是我尝试过的;它很慢,但是返回我需要的。但是,除了速度之外,还有另一个问题:它只能找到在给定月份设备的最后一个条目之前丢失的时间间隔;之后的所有内容都将被忽略,因此有可能会错过额外的缺失值间隔。

  • 我有一篇很长的文章,还有一长串我想在这篇文章中找到的单词。 现在,为了搜索这些单词,我检查“正则表达式”,然后找到“word1 | word2 | word3 | word4…”问题是,如果其中一个单词是“eat”,那么包含“eat”的每个单词也会高亮显示。我怎样才能防止呢?

  • 问题内容: 我有这个架构 样本数据 SQL Fiddle演示。我已经插入了一些示例数据。 查兰芝 我需要找到唱片标题的所有父母。如何仅通过一个查询就可以获取所有父母? 我的意思是我需要这个结果: 期望的输出 假设我想使用其所有父项来获取条目,并且要使用where条件,那么它应该获取上述记录。 问题答案: 演示版

  • 在我的PostgreSQL数据库中,有一个栅格表和一个具有相同投影的点表。点表具有诸如 id、地址和几何等列。栅格表具有 id、r_proj4 和 rast 等列。栅格表的每一行描述一个栅格切片。如何检索每个点的栅格值? 我希望粗略的指导方针如何解决这个问题和PostGIS代码示例。

  • 表示颜色表的查找表,用于从一个数据值的范围中确定颜色值。 代码示例 const lut = new Lut( 'rainbow', 512 ); const color = lut.getColor( 0.5 ); 构造函数 Lut( colormap, numberOfColors ) colormap - (可选)从预定义的颜色表中设置一个颜色表。可选值有:"rainbow"、 "coolto