什么是视图定义
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是视图定义相关的知识,希望对你有一定的参考价值。
视图是从一个或多个表或视图中导出的表,其结构和数据是建立在对表的查询基础上的。和表一样,视图也是包括几个被定义的数据列和多个数据行,但就本质而言这些数据列和数据行来源于其所引用的表。所以视图不是真实存在的基础表而是一张虚表,视图所对应的数据并不实际地以视图结构存储在数据库中,而是存储在视图所引用的表中。
视图一经定义便存储在数据库中,与其相对应的数据并没有像表那样又在数据库中再存储一份,通过视图看到的数据只是存放在基本表中的数据。对视图的操作与对表的操作一样,可以对其进行查询、修改(有一定的限制)、删除。
当对通过视图看到的数据进行修改时,相应的基本表的数据也要发生变化,同时,若基本表的数据发生变化,则这种变化也可以自动地反映到视图中。
视图有很多优点,主要表现在:
�6�1视点集中
�6�1简化操作
�6�1定制数据
�6�1合并分割数据
�6�1安全性
如果你要创建一个视图,为其指定一个名称和一个查询即可。Microsoft SQL Server只保存视图的元数据(metadata),用于描述这个对象,以及它所包含的列、安全、依赖等。当你查询视图时,无论是获取数据还是修改数据,查询处理器(query processor)都会用视图定义代替视图引用。也就是说,查询处理器展开视图定义并生成访问基对象(underlying objects)的执行计划。
视图在数据库中发挥着重要的作用。视图的重要用途之一便是被用作一个抽象装置(abstraction mechanism)。例如,在适当时利用视图你可以很容易地为基础数据提供或多或少的规范化映像(normalized picture),这样就不用更改实际数据的规范化(normalization)。通过应用模块化的方法(逐步解决复杂问题),可以简化解决方案。可以利用视图访问经过筛选和处理的数据,而不是直接对基表(base table)进行操作(让视图的架构和基对象的架构相同),可以把视图作为一个安全层(security layer)(在一定程度上)。
如果在视图上创建索引,它在提高性能方面也发挥着重要作用。在视图上创建聚集索引(clustered index)会让它的数据真正地保存在磁盘上,而不再是虚拟的数据。我会在本章专门用一节介绍索引视图。现在,我们先来关注没有索引的视图,它们通常没有特定的性能影响,包括消极的或积极的。
与其他的表表达式(如派生表、公用表表达式,或内联表值用户定义函数[inline table-valued user-defined function,UDF])一样,视图的查询定义必须满足3个条件:
不能在查询定义中使用ORDER BY,除非定义中包含TOP或FOR XML说明符。
所有的结果列必须有名称。
所有结果列的名称必须是唯一的。
定义视图的查询中在没有TOP或FOR XML说明符的情况下不能包含ORDER BY子句,这是因为视图被认为表示一个表。表是一个逻辑实体,它的行没有顺序,不同于游标,游标是一个物理对象,它可以对行排序。表中的所有列必须有名称,且名称必须是唯一的,这一点勿庸置疑。为视图的目标列指定名称有两种方法,可以在视图名称后面的圆括号内指定,也可以用每个表达式后面的别名作为列名称。
来看一个示例,运行下面的代码创建VcustsWithOrders视图。
SET NOCOUNT ON;USE Northwind;GOIF OBJECT_ID(‘dbo.VcustsWithOrders’) IS NOT NULLDROP VIEW dbo.VcustsWithOrders;GOCREATE VIEW dbo.VcustsWithOrdersASSELECT CustomerID, CompanyName, ContactName, ContactTitle,Address, City, Region, PostalCode, Country, Phone, FaxFROM Customers AS CWHERE EXISTS(SELECT * FROM dbo.Orders AS OWHERE O.CustomerID = C.CustomerID);GO 参考技术A 视图简介
一、视图简介
视图是原始数据库数据的一种变换,是查看表中数据的另外一种方式。可以将视图看成是一个移动的窗口,通过它可以看到感兴趣的数据。
视图是从一个或多个实际表中获得的,这些表的数据存放在数据库中。那些用于产生视图的表叫做该视图的基表。一个视图也可以从另一个视图中产生。
视图的定义存在数据库中,与此定义相关的数据并没有再存一份于数据库中。通过视图看到的数据存放在基表中。视图看上去非常象数据库的物理表,对它的操作同任何其它的表一样。当通过视图修改数据时,实际上是在改变基表中的数据;相反地,基表数据的改变也会自动反映在由基表产生的视图中。由于逻辑上的原因,有些视图可以修改对应的基表,有些则不能(仅仅能查询)。
二、视图的作用
视图有以下的作用:
* 简单性。看到的就是需要的。视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件。
* 安全性。通过视图用户只能查询和修改他们所能见到的数据。数据库中的其它数据则既看不见也取不到。数据库授权命令可以使每个用户对数据库的检索限制到特定的数据库对象上,但不能授权到数据库特定行和特定的列上。通过视图,用户可以被限制在数据的不同子集上:
使用权限可被限制在基表的行的子集上。
使用权限可被限制在基表的列的子集上。
使用权限可被限制在基表的行和列的子集上。
使用权限可被限制在多个基表的连接所限定的行上。
使用权限可被限制在基表中的数据的统计汇总上。
使用权限可被限制在另一视图的一个子集上,或是一些视图和基表合并后的子集上。
* 逻辑数据独立性。视图可帮助用户屏蔽真实表结构变化带来的影响。
三、视图的安全性
视图的安全性可以防止未授权用户查看特定的行或列,是用户只能看到表中特定行的方法如下:
1、在表中增加一个标志用户名的列;
2、建立视图,是用户只能看到标有自己用户名的行;
3、把视图授权给其他用户。
四、逻辑数据独立性
视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,应用一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。视图可以在以下几个方面使程序与数据独立:
1、如果应用建立在数据库表上,当数据库表发生变化时,可以在表上建立视图,通过视图屏蔽表的变化,从而应用程序可以不动。
2、如果应用建立在数据库表上,当应用发生变化时,可以在表上建立视图,通过视图屏蔽应用的变化,从而使数据库表不动。
3、如果应用建立在视图上,当数据库表发生变化时,可以在表上修改视图,通过视图屏蔽表的变化,从而应用程序可以不动。
4、如果应用建立在视图上,当应用发生变化时,可以在表上修改视图,通过视图屏蔽应用的变化,从而数据库可以不动。
如何使用按钮创建自定义集合视图?
【中文标题】如何使用按钮创建自定义集合视图?【英文标题】:How to create custom collection views with buttons? 【发布时间】:2017-06-19 23:42:31 【问题描述】:我想创建一个集合视图,其中每个集合单元格都是可自定义的,并且每个单元格都有一个描述和一个按钮,每个单元格都应该指向另一个视图控制器,就像这样。
【问题讨论】:
那么是什么阻止您创建自定义单元格?到目前为止,您尝试过什么? 我只能用图像创建一个集合视图,但我真的不知道如何将它们转换为自定义按钮单元格 您是否尝试过将按钮拖入情节提要中的自定义单元格? 是的,但是当我在模拟器上运行应用程序时,单元格会随着文本、按钮和其中的图像一起消失,我也无法做到,所以情节提要中有多个单元格那些不容易看到的,可以水平滚动,就像上面的图片一样 UICollectionViewCells 可以通过实现 UICollectionViewDelegate 方法 didSelectItemAt: 表现得像按钮一样 【参考方案1】:详情
xCode 8.3.2,斯威夫特 3.1
完整样本
CollectionViewCell
import UIKit
protocol CollectionViewCellDelegate: class
func touchUpInside(delegatedFrom cell: CollectionViewCell)
class CollectionViewCell: UICollectionViewCell
@IBOutlet weak var button: UIButton!
weak var delegate: CollectionViewCellDelegate?
@IBAction func touchUpInside(_ sender: UIButton)
delegate?.touchUpInside(delegatedFrom: self)
视图控制器
import UIKit
class ViewController: UIViewController
@IBOutlet weak var collectionView: UICollectionView!
@IBOutlet weak var collectionViewFlowLayout: UICollectionViewFlowLayout!
override func viewDidLoad()
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
collectionView.dataSource = self
collectionView.delegate = self
override func viewWillLayoutSubviews()
super.viewWillLayoutSubviews()
let inset:CGFloat = 20.0
collectionViewFlowLayout.itemSize = collectionView.frame.size
collectionViewFlowLayout.itemSize.width -= inset*2
collectionViewFlowLayout.itemSize.height -= inset*2
collectionViewFlowLayout.sectionInset.left = inset
collectionViewFlowLayout.sectionInset.right = inset
extension ViewController: UICollectionViewDataSource
func numberOfSections(in collectionView: UICollectionView) -> Int
return 1
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
return 10
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell", for: indexPath) as! CollectionViewCell
cell.delegate = self
return cell
extension ViewController: UICollectionViewDelegate
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
print("Selected cell: \(indexPath)")
extension ViewController: CollectionViewCellDelegate
func touchUpInside(delegatedFrom cell: CollectionViewCell)
if let indexPath = collectionView.indexPath(for: cell)
print("Button pressed in cell: \(indexPath)")
Main.storyboard
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12120" systemVersion="16F73" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12088"/>
<capability name="Constraints to layout margins" minToolsVersion="6.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="tne-QT-ifu">
<objects>
<viewController id="BYZ-38-t0r" customClass="ViewController" customModule="***_44641545" customModuleProvider="target" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
<viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" />
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<collectionView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" showsVerticalScrollIndicator="NO" dataMode="prototypes" translatesAutoresizingMaskIntoConstraints="NO" id="H99-jD-EE5">
<rect key="frame" x="0.0" y="20" />
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<collectionViewFlowLayout key="collectionViewLayout" scrollDirection="horizontal" minimumLineSpacing="10" minimumInteritemSpacing="10" id="47T-Wc-WqB">
<size key="itemSize" />
<size key="headerReferenceSize" />
<size key="footerReferenceSize" />
<inset key="sectionInset" minX="0.0" minY="0.0" maxX="0.0" maxY="0.0"/>
</collectionViewFlowLayout>
<cells>
<collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="CollectionViewCell" id="X5i-B5-0He" customClass="CollectionViewCell" customModule="***_44641545" customModuleProvider="target">
<rect key="frame" x="0.0" y="18.5" />
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
<rect key="frame" x="0.0" y="0.0" />
<autoresizingMask key="autoresizingMask"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ng9-IJ-srl">
<rect key="frame" x="152.5" y="560" />
<state key="normal" title="Button">
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<action selector="touchUpInside:" destination="X5i-B5-0He" eventType="touchUpInside" id="mNT-vz-F9c"/>
</connections>
</button>
</subviews>
</view>
<color key="backgroundColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<constraints>
<constraint firstAttribute="bottomMargin" secondItem="ng9-IJ-srl" secondAttribute="bottom" constant="12" id="AGX-Ye-rNr"/>
<constraint firstItem="ng9-IJ-srl" firstAttribute="centerX" secondItem="X5i-B5-0He" secondAttribute="centerX" id="sFI-KT-pyQ"/>
</constraints>
<connections>
<outlet property="button" destination="ng9-IJ-srl" id="mnC-Ln-j2F"/>
</connections>
</collectionViewCell>
</cells>
</collectionView>
</subviews>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="H99-jD-EE5" firstAttribute="bottom" secondItem="wfy-db-euE" secondAttribute="top" id="0hj-ig-J9f"/>
<constraint firstItem="H99-jD-EE5" firstAttribute="leading" secondItem="8bC-Xf-vdC" secondAttribute="leading" id="NWe-0c-k9w"/>
<constraint firstItem="H99-jD-EE5" firstAttribute="top" secondItem="y3c-jy-aDJ" secondAttribute="bottom" id="axO-mx-zBv"/>
<constraint firstAttribute="trailing" secondItem="H99-jD-EE5" secondAttribute="trailing" id="eP4-pi-EX2"/>
</constraints>
</view>
<connections>
<outlet property="collectionView" destination="H99-jD-EE5" id="Cje-QN-sIz"/>
<outlet property="collectionViewFlowLayout" destination="47T-Wc-WqB" id="qBp-S0-pyU"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="132" y="137.18140929535232"/>
</scene>
</scenes>
</document>
结果
【讨论】:
【参考方案2】:对于可能在我之后阅读此内容的任何人,我找到了一种方法来使用 Vasily Bodnarchuk 提供的其他答案来创建按钮。
按照他所做的一切,除了 Main.storyboard 代码(我太困惑了,无法弄清楚如何实现它)我只是进入了我的 ViewController 并向 UIViewControllerCell 添加了一个按钮。
之后,我创建了一个从我的 UICollectionView 到下一个 ViewController 的 Segway 并给它一个标识符。
我调整了上面提供的代码,并在他的函数中添加了一个“if”语句来打印选定的单元格:
extension ViewController: UICollectionViewDelegate
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
print("Selected cell: \(indexPath)")
if indexPath == [0,0]
self.performSegue(withIdentifier: "toGridView", sender: self)
如果您在控制台中注意到,它会打印每个单元格的值,并且我使用 indexPath 设置为一个值来引用该单元格。在这段代码中,[0,0] 处的按钮(单元格)将在单击时转到下一个 ViewController。
您可以为所有按钮执行此操作!
我会附上屏幕截图,以防我的描述让你感到困惑。
【讨论】:
以上是关于什么是视图定义的主要内容,如果未能解决你的问题,请参考以下文章