Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“的缺点;“合并”;mySQL中的查找表与单个查找表_Mysql_Database Design_Lookup Tables - Fatal编程技术网

“的缺点;“合并”;mySQL中的查找表与单个查找表

“的缺点;“合并”;mySQL中的查找表与单个查找表,mysql,database-design,lookup-tables,Mysql,Database Design,Lookup Tables,仅使用一个组合查找表(mySQL数据库)来存储表之间的“链接”是否比使用单个查找表有很大的缺点(可能在查询速度等方面)?我这样问是因为在我的项目场景中,我最终会得到100多个单独的查找表,我认为这将需要大量的工作来设置和维护。但为了使示例更简单,这里有一个仅在4个表之间的简化场景: 表:教师 教师 名称 1. X先生 2. Y太太 查找表通常是静态的,因此不会有太多的维护开销。但是,如果更新查找数据,现在必须管理单个查找表的行子集的生命周期,这与在新数据可用时仅截断表相比可能会变得棘手。在这里,

仅使用一个组合查找表(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谢谢,复制到答案中。