使用视图作为数据库中模块之间的数据接口
Posted
技术标签:
【中文标题】使用视图作为数据库中模块之间的数据接口【英文标题】:Using views as a data interface between modules in a database 【发布时间】:2010-06-10 19:01:10 【问题描述】:我正在研究 mysql 中一个简单的小型数据库的数据库布局。 我们希望将这个系统模块化,以便为我们将要制作的不同实现提供更多的灵活性。现在,想法是让数据库中的一个模块(简单的一组表,它们之间有约束)通过视图将其数据传递给下一个模块。这样,一个模块中的更改不会影响其他模块,因为我们可以确保在视图中随时存在正确的数据,尽管表的底层结构可能不同。
处理数据库的应用程序的结构也将模块化。
这是有时会做的事情吗? 在技术方面,据我所知,视图不能有主键 - 那么我将如何处理这样的视图? 还有哪些问题需要考虑?
【问题讨论】:
这涉及我认为的同一主题,尽管从不同的角度。我自己并不关心性能(还没有......)mysqlperformanceblog.com/2007/08/12/… 【参考方案1】:这是有时会做的事情吗?
是的,视图通常用于将事物与处于变化状态的数据模型隔离开来。
在技术方面,据我所知,视图不能有主键 - 我将如何处理这样的视图?
MySQL 不支持物化视图。非物化视图只是准备好的 SQL 语句 - 它们不存在于数据模型中,性能最终取决于基础表和查询优化中存在的内容。
也就是说,不推荐分层视图(创建一个从另一个视图中选择的视图) - 它很脆弱,而且由于有人希望查询优化简单而导致性能下降的风险很大。
【讨论】:
“也就是说,不推荐分层视图(创建一个从另一个视图中选择的视图)——它很脆弱,而且由于有人想要简单而不是查询优化,因此性能下降的风险很大。”如果我可以单独为这个声明投票,我会支持你一百万次。我必须使用能够做到这一点的系统,它几乎让我们失去了数百万美元的客户,因为性能太差了。对于这种垃圾,以后也没有简单的解决方法。 非常感谢您的回答。也许我可以澄清问题的最后一部分:我并不是在暗示分层视图,而是希望有一个与视图中的数据相关的表(通过外键)......只是我不知道是什么相关,因为视图没有主键。我可以在视图中“手动”构建一个,我猜如果这是要走的路,可以结合一些值? @Stefan:主键是一个约束,您不能将其应用于非物化视图。重要的是视图中有列,您可以在 JOIN 子句中引用相关表以获取相关数据。 非常感谢,现在我明白了。我会使用几个条件,例如 (t1.a=view.a AND t1.b=view.b) 来设置连接。 @Stefan:是的,你明白了。当您觉得您的问题已得到解答时,不要忘记标记答案。【参考方案2】:这是一种有效的方法,但您当然应该小心:
确保您的查询已经过很好的性能测试,并分析了查询计划。视图将使用基础表的索引,但执行计划错误的可能性更高。
确保存在足够的视图来涵盖所有需要的信息。
【讨论】:
以上是关于使用视图作为数据库中模块之间的数据接口的主要内容,如果未能解决你的问题,请参考以下文章