Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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
Database design 在数据库中重复字段以节省一些复杂的查询,这是一种糟糕的设计实践吗?_Database Design_Relational Database - Fatal编程技术网

Database design 在数据库中重复字段以节省一些复杂的查询,这是一种糟糕的设计实践吗?

Database design 在数据库中重复字段以节省一些复杂的查询,这是一种糟糕的设计实践吗?,database-design,relational-database,Database Design,Relational Database,如果您有几个连接表,其中包含您需要的所有信息,但它涉及一些复杂的连接等。在您选择的表中添加一个额外的字段来保存这些额外的查询是否更好 提前谢谢 Paul我确实看到过这种情况,尽管我怀疑这是否是一种好的设计实践,但它似乎有时能提供一些好的性能。特别是我将其视为Rails中的计数器缓存,其中提供了一个新字段以保持计数。我想如果你有太多的条目,它确实可以产生更好的性能。我确实看到过这种情况,尽管我怀疑它是否是一种好的设计实践,但它似乎有时可以提供一些好的性能。特别是我将其视为Rails中的计数器缓存,

如果您有几个连接表,其中包含您需要的所有信息,但它涉及一些复杂的连接等。在您选择的表中添加一个额外的字段来保存这些额外的查询是否更好

提前谢谢


Paul

我确实看到过这种情况,尽管我怀疑这是否是一种好的设计实践,但它似乎有时能提供一些好的性能。特别是我将其视为Rails中的计数器缓存,其中提供了一个新字段以保持计数。我想如果你有太多的条目,它确实可以产生更好的性能。

我确实看到过这种情况,尽管我怀疑它是否是一种好的设计实践,但它似乎有时可以提供一些好的性能。特别是我将其视为Rails中的计数器缓存,其中提供了一个新字段以保持计数。我想如果你有太多的条目,它确实可以产生更好的性能。

是和否

这故意违背数据库规范化的原则,因此被称为“非规范化”

它的缺点几乎就是我们正常化的所有原因,最明显的是它引入了一种错误可以使数据库与自身不一致的方式。因此,一般来说,DB设计不好。实际上,它还使数据库更新更复杂,因此成本更高(假设没有错误)

但是,它可以为某些查询提供性能优势,这些查询是始终超时和琐碎之间的区别。因此,这是一个合理的,有时是必要的优化

我想采取以下方法:

  • 仔细想想它的必要性。特别是,CTE已经使一些情况下我不再需要使用这种技术,因为CTE可以在几分钟内完成过去需要多次查找表的工作(事实上,在我过去使用过的大多数情况下)。有时,真正需要做的就是彻底检查所涉及的指标。最后,值得不时尝试通过使用这种非规范化而优化的查询,而不是使用它;各种各样的改变都可以消除对它的需求

  • < L> > P>为相关数据创建一个单独的表,将其视为“查找”,不被视为主要设计的一部分,向其他开发人员强调,这是一种优化,而不是坏的DB设计。如果一个错误导致上面提到的那种不一致,这也使得重建整个过程变得更容易

  • 使用触发器来维护表,这样对它所依赖的表的更新将自动保持正确,而不必在更新时引入关于维护表的特殊规则(这些规则几乎肯定会被破坏,或者至少会导致代码不太清晰)

  • 是和否

    这故意违背数据库规范化的原则,因此被称为“非规范化”

    它的缺点几乎就是我们正常化的所有原因,最明显的是它引入了一种错误可以使数据库与自身不一致的方式。因此,一般来说,DB设计不好。实际上,它还使数据库更新更复杂,因此成本更高(假设没有错误)

    但是,它可以为某些查询提供性能优势,这些查询是始终超时和琐碎之间的区别。因此,这是一个合理的,有时是必要的优化

    我想采取以下方法:

  • 仔细想想它的必要性。特别是,CTE已经使一些情况下我不再需要使用这种技术,因为CTE可以在几分钟内完成过去需要多次查找表的工作(事实上,在我过去使用过的大多数情况下)。有时,真正需要做的就是彻底检查所涉及的指标。最后,值得不时尝试通过使用这种非规范化而优化的查询,而不是使用它;各种各样的改变都可以消除对它的需求

  • < L> > P>为相关数据创建一个单独的表,将其视为“查找”,不被视为主要设计的一部分,向其他开发人员强调,这是一种优化,而不是坏的DB设计。如果一个错误导致上面提到的那种不一致,这也使得重建整个过程变得更容易

  • 使用触发器来维护表,这样对它所依赖的表的更新将自动保持正确,而不必在更新时引入关于维护表的特殊规则(这些规则几乎肯定会被破坏,或者至少会导致代码不太清晰)


  • 一般来说,原则上我会说不。在db设计上没有妥协。我同意Jon Hanna的回答。您不会为了编写更简单的查询而复制数据,我这样做只是为了提高性能。您可以创建一个视图来简化访问dataDaveo的方式,我认为它们的意思是“复杂”的,即数据库必须执行哪些操作来执行它,而不是编写它(它总是可以被视图和函数分解,然后保存为可重用的过程或函数),我的意思是关于数据库读取的复杂。。。谢谢你的回答。原则上,我会说不。在db设计上没有妥协。我同意Jon Hanna的回答。您不会为了编写更简单的查询而复制数据,我这样做只是为了提高性能。您可以创建一个视图来简化访问dataDaveo的方式,我假设它们的意思是“复杂”的,因为数据库必须执行哪些操作才能执行