第2章关系数据模型.ppt
文本预览下载声明
* 引用完整性约束 即前面所学的“参照完整性约束” [复习] 若属性(组)F是基本关系R的外码,它与基本关系S的主码Ks相对应,则对于R中每个元组在F上的值必须为: 空值(F的每个属性值均为空值); 等于S中某个元组的主码值。 参照完整性规则就是定义外码与主码之间的引用规则 职工(职工编号,姓名,性别,部门编号)(关系R-参照关系) 部门(部门编号,名称,地址,简介) (关系S-被参照关系) 关系S的主码 关系R的外码 * 用关系代数表述引用完整性 概括来讲,如果关系R中的某个元组的属性分量(设为A)的值为v,那么按照设计意图,人们期望v也是另一个关系S的某个元组的一个相应的属性分量(设为B)的值。 用关系代数将引用完整性表述为 或等价地写为 * 示例1 例2.21 考虑电影数据库中的两个关系 Movies( title, year, length, genre, studioName, producerC#) MovieExec(name, address, cert# , netWorth) 必须保证Movies关系中每个元组的producerC#分量也必须在关系MovieExec元组的cert#分量中出现。 该约束用集合-包含的形式写为: * 示例2 如果一个“值”在多个属性中出现,则也可以为它引入引用完整性约束。 例如: StarsIn (movieTitle, movieYear, starName) Movies( title, year, length, genre, studioName, producerC#) 引用完整性约束应该表达为: * 键约束 P33 例2.23 MovieStar (name, address, gender, birthdate) name为主键,那就意味着没有任何两个元组在分量name上具有相同的值。该约束蕴含着几个事实,其中之一是:关系MovieStar上必然不存在这样的元组对:它们在name分量上值相同,但是却在address分量上具有不同的值。这一约束可以表达为: MS1和MS2是对关系MovieStar重命名得来的。 * 其他的约束举例1 假设关系MovieStar中gender属性的合法值只有‘F’和‘M’于是这个约束就可以表示为: 意思是:MovieStar的元组中,gender分量既不等于‘F’也不等于‘M’的结果是空集。 * 其他的约束举例2 要求一个电影公司的经理至少拥有$10 000 000的资产 该约束可以用如下关系代数表达: 或 MovieExec(name, address, cert# , netWorth) Studio( name, address, presC#) * 1、CHAR。CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充。 2、VARCHAR。存储变长数据,但存储效率没有CHAR高。如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义 为 VARCHAR(10)是最合算的。VARCHAR类型的实际长度是它的值的实际长度+1。为什么“+1”呢?这一个字节用于保存实际使用了多大的长度。 从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际情况找到权衡点。 3、TEXT。text存储可变长度的非Unicode数据,最大长度为2^31-1(2,147,483,647)个字符。 * 4、NCHAR、NVARCHAR、NTEXT。这三种从名字上看比前面三种多了个“N”。它表示存储的是Unicode数据类型的字符。我们知道 字符中,英文字符只需要一个字节存储就足够了,但汉字众多,需要两个字节存储,英文与汉字同时存在时容易造成混乱,Unicode字符集就是为了解决字符 集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。nchar、nvarchar的长度是在1到4000之间。 和char、varchar比较起来,nchar、nvarchar则最多存储4000个字符,不论是英文还是汉字;而char、varchar最多能存 储8000个英文,4000个汉字。可以看出使用nchar、nvarchar数据类型时不用担心输入的字符是英文还是汉字,较为方便,但在存储英文时数 量上有些损失。 * * P25 例 2.14 两个公共属性 R: A B
显示全部