什么时候以及为什么有些人决定他们需要在他们的数据库中创建一个视图?为什么不运行一个普通的存储过程或选择?
当前回答
几个原因: 如果您有复杂的连接,有时最好有一个视图,这样任何访问都会有正确的连接,开发人员不必记住他们可能需要的所有表。通常情况下,这可能用于财务应用程序,其中所有财务报告都基于同一组数据,这是非常重要的。
如果你有用户,你想限制他们可以看到的记录,你可以使用一个视图,只给他们访问视图,而不是底层表,然后查询视图
Crystal报表似乎更喜欢使用视图来存储过程,因此编写大量报表的人倾向于使用大量视图
视图在重构数据库时也非常有用。您通常可以通过创建一个视图来隐藏更改,以便旧代码看不到它。阅读重构数据库的相关内容,了解它是如何工作的,因为这是一种非常强大的重构方式。
其他回答
这并没有确切地回答你的问题,但我认为值得一提的是物化视图。我的经验主要是使用Oracle,但是SQL-Server应该是相当相似的。
We used something similar in our architecture to address XML performance problems. Our systems are designed with a lot of data stored as XML on a row and applications might need to query particular values within it. Handling lots of XMLTypes and running XPaths across large number of rows has a large impact on performance so we use a form of materialized views to extract the desired XML nodes out into a relational table anytime the base table changes. This effectively provides a physical snapshot of the query at a point in time as opposed to standard views which would run their query on demand.
以下是两个常见的原因:
你可以用它来保证安全。在主表上不授予权限,创建限制列或行访问的视图,并向用户授予查看视图的权限。
你可以为了方便使用它。将视图中经常使用的一些表连接在一起。这可以使查询保持一致并更容易。
它可以作为ORM和表之间的“中间人”。
例子:
我们有一个Person表,我们需要改变它的结构,以便将SomeColumn列移动到另一个表,并与之有一对多的关系。
然而,系统的大多数情况下,就Person而言,仍然将SomeColumn作为一个单独的东西使用,而不是很多东西。我们使用一个视图将所有的SomeColumns聚集在一起,并将其放在视图中,效果很好。
这是可行的,因为数据层发生了变化,但业务需求没有根本变化,因此业务对象不需要更改。如果业务对象必须改变,我不认为这是一个可行的解决方案,但视图绝对是一个很好的中间点。
在我看来,存储过程更多的是一种可以针对数据调用的方法,而视图提供了一种机制来创建基础数据的合成版本,可以根据它创建查询或存储过程。当简化或聚合有意义时,我将创建一个视图。当我想提供一个非常特定的服务时,我将编写一个存储过程。
我正在创建xxx,映射主表(如Products表)和引用表(如ProductType或ProductDescriptionByLanguage)之间的所有关系。这将创建一个视图,允许我检索产品及其从外键转换到描述的所有详细信息。 然后我可以使用ORM创建对象,轻松地构建网格、组合框等。
推荐文章
- 对象'DF__*'依赖于列'*' -将int改为double
- 将映像存储在MongoDB数据库中
- 重复Mongo ObjectId的可能性在两个不同的集合中生成?
- 如何根据出生日期和getDate()计算年龄(以年为单位)
- 最有效的T-SQL方法垫一个varchar的左边到一定的长度?
- 如何改变SQL在“编辑前200行”在SSMS 2008
- 字符串作为SQL数据库的主键
- 截断SQL Server日志文件的命令是什么?
- SQL:从时间戳日期减去1天
- 我如何把一个'if子句'在一个SQL字符串?
- 作为变量的表名
- 是否可以直接选择EXISTS作为位?
- MySQL选择列不为空的位置
- SQL JOIN vs IN性能?
- SQL的地方. .IN子句多列