【问题标题】:Disadvantage of "combined" lookup table in mySQL vs individual lookup tablesmySQL 中“组合”查找表与单独查找表的缺点
【发布时间】:2021-06-22 05:57:50
【问题描述】:

与使用单独的查找表相比,仅使用一个组合查找表(mySQL 数据库)来存储表之间的“链接”是否有很大的缺点(可能是查询速度等)?我之所以这么问,是因为在我的项目场景中,我最终会得到一百多个单独的查找表,我认为这些查找表需要大量的设置和维护工作。但是为了做一个更简单的例子,这里是一个只有 4 个表之间的简化场景:

表:老师

teacherID name
1 Mr. X
2 Mrs. Y

表:学生

studentID name
4 Tom
5 Chris

表:类

classID name
7 Class A
8 Class B

表格:语种

languageSpokenID name
10 English
11 German

======================== 个人查找表 ===================== =====

表:student_teacher

studentID teacherID
4 1
5 1

表:student_class

studentID classID
4 7
5 8

表:student_languageSpoken

studentID languageSpokenID
4 10
4 11

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

辅助表:allTables

tableID name
1 teacher
2 student
3 class
4 languageSpoken

表:lookupTable

table_A ID_A table_B ID_B
1 1 2 4
1 1 2 5
3 7 2 4
3 8 2 5

【问题讨论】:

    标签: mysql database-design lookup-tables


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您的第二个查找模式绝对没用。

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

      您的查找表是可逆的,即可以通过 2 种方式编写相同的引用。当然,您可以添加像CHECK table_A < table_B 这样的 CHECK 约束(另外它避免了自引用),但这又会降低性能。

      您的查找不会阻止不存在的关系(例如,类和语言不相关,但没有什么可以阻止为此类关系创建行)。同样,额外的限制和性能下降。

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

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


      有一条规则——非关系关系必须分开。


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

      【讨论】:

      • 另一个非常重要的一点:确保引用完整性的外键约束不能用于“组合查找”方法。它们需要通过复杂且容易出错的触发器来模拟。总的来说,“组合查找”方法只是一个可怕的想法。
      • @stickybit 谢谢,复制到答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      • 2018-02-01
      相关资源
      最近更新 更多