“的缺点;“合并”;mySQL中的查找表与单个查找表
仅使用一个组合查找表(mySQL数据库)来存储表之间的“链接”是否比使用单个查找表有很大的缺点(可能在查询速度等方面)?我这样问是因为在我的项目场景中,我最终会得到100多个单独的查找表,我认为这将需要大量的工作来设置和维护。但为了使示例更简单,这里有一个仅在4个表之间的简化场景: 表:教师 教师 名称 1. X先生 2. Y太太“的缺点;“合并”;mySQL中的查找表与单个查找表,mysql,database-design,lookup-tables,Mysql,Database Design,Lookup Tables,仅使用一个组合查找表(mySQL数据库)来存储表之间的“链接”是否比使用单个查找表有很大的缺点(可能在查询速度等方面)?我这样问是因为在我的项目场景中,我最终会得到100多个单独的查找表,我认为这将需要大量的工作来设置和维护。但为了使示例更简单,这里有一个仅在4个表之间的简化场景: 表:教师 教师 名称 1. X先生 2. Y太太 查找表通常是静态的,因此不会有太多的维护开销。但是,如果更新查找数据,现在必须管理单个查找表的行子集的生命周期,这与在新数据可用时仅截断表相比可能会变得棘手。在这里,
查找表通常是静态的,因此不会有太多的维护开销。但是,如果更新查找数据,现在必须管理单个查找表的行子集的生命周期,这与在新数据可用时仅截断表相比可能会变得棘手。在这里,如果您的查找表具有不同的模式,并且列必须为null,因为它们应用于给定的“类型”行,我会非常小心。您可能无法实现正确的外键。如果您碰巧使用了错误的id,您将得到一个无意义的值。这有助于保持数据的一致性(在生产系统中)。如果这是一个学校项目,尤其是一个数据库类,你会因为没有使用教科书标准化而受到指责。查找表通常是静态的,因此不会有太多的维护开销。但是,如果更新查找数据,现在必须管理单个查找表的行子集的生命周期,这与在新数据可用时仅截断表相比可能会变得棘手。在这里,如果您的查找表具有不同的模式,并且列必须为null,因为它们应用于给定的“类型”行,我会非常小心。您可能无法实现正确的外键。如果您碰巧使用了错误的id,您将得到一个无意义的值。这有助于保持数据的一致性(在生产系统中)。如果这是一个学校项目,尤其是一个数据库类,你会因为没有使用教科书标准化而受到谴责。你的第二次查找模式绝对没有用 您可以通过表的名称/索引来引用表。但不能直接使用此关系(tablename不能参数化),需要构建条件连接表达式或使用动态SQL。这比较慢 您的查找表是可逆的,即相同的引用可以通过两种方式写入。当然,您可以添加检查约束,如
检查表A(此外,它避免了自引用),但这会再次降低性能
查找不会阻止不存在的关系(例如,类和语言不相关,但不会阻止为此类关系创建行)。同样,额外的约束和性能下降
还有更多的缺点。。。但我懒得把它们都列出来
另一个非常重要的点是:确保引用完整性的外键约束不能用于“组合查找”方法。它们需要由复杂且容易出错的触发器进行模拟。总的来说,“组合查找”方法只是一个可怕的想法
有一条规则——非关系关系必须分开
在第一个计划中,学生是否可以同时在多个班级学习?如果没有,则您不需要在student\u class
查找表中查找,并且class\u id
是student
表中的一个属性。您的第二个查找模式绝对无用
您可以通过表的名称/索引来引用表。但不能直接使用此关系(tablename不能参数化),需要构建条件连接表达式或使用动态SQL。这比较慢
您的查找表是可逆的,即相同的引用可以通过两种方式写入。当然,您可以添加检查约束,如检查表A(此外,它避免了自引用),但这会再次降低性能
查找不会阻止不存在的关系(例如,类和语言不相关,但不会阻止为此类关系创建行)。同样,额外的约束和性能下降
还有更多的缺点。。。但我懒得把它们都列出来
另一个非常重要的点是:确保引用完整性的外键约束不能用于“组合查找”方法。它们需要由复杂且容易出错的触发器进行模拟。总的来说,“组合查找”方法只是一个可怕的想法
有一条规则——非关系关系必须分开
在第一个计划中,学生是否可以同时在多个班级学习?如果不是,那么您不需要在student\u class
查找表中,并且class\u id
是student
表中的一个属性。另一个非常重要的点:确保引用完整性的外键约束不能用于“组合查找”方法。它们需要由复杂且容易出错的触发器进行模拟。总的来说,“组合查找”方法是一个可怕的想法。@stickybit谢谢,复制到答案中。另一个非常重要的点是:确保引用完整性的外键约束不能用于“组合查找”方法。它们需要由复杂且容易出错的触发器进行模拟。总的来说,“组合查找”方法只是一个可怕的想法。@stickybit谢谢,复制到答案中。