精华内容
下载资源
问答
  • 1、什么是视图通俗的讲,视图就是一条SELECT语句执行后返回的结果集。所以我们创建视图的时候,主要的工作就落创建这条SQL查询语句上。视图是一种虚拟存在的表...当表的数据发生变化时,视图也反映了这些数据的...

    1、什么是视图

    通俗的讲,视图就是一条SELECT语句执行后返回的结果集。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。

    视图是一种虚拟存在的表或逻辑表,视图并不在数据库中实际存在,行和列数据来自定义视图的查询总使用的表,并且是在使用视图时动态生成的。因为它与物理模式无关。数据库系统将数据库视图存储为具有连接的SQL SELECT语句。当表的数据发生变化时,视图也反映了这些数据的变化。

    2、视图的特性

    视图是对若干张基本表的引用,一张虚表,查询语句执行的结果,不存储具体的数据(基本表数据发生了改变,视图也会跟着改变);

    可以跟基本表一样,进行增删改查操作(ps:增删改操作有条件限制);

    3、视图的优点

    数据库视图允许简化复杂查询:数据库视图由与许多基础表相关联的SQL语句定义。 您可以使用数据库视图来隐藏最终用户和外部应用程序的基础表的复杂性。 通过数据库视图,您只需使用简单的SQL语句,而不是使用具有多个连接的复杂的SQL语句。

    数据库视图有助于限制对特定用户的数据访问。 您可能不希望所有用户都可以查询敏感数据的子集。可以使用数据库视图将非敏感数据仅显示给特定用户组。

    数据库视图提供额外的安全层。 安全是任何关系数据库管理系统的重要组成部分。 数据库视图为数据库管理系统提供了额外的安全性。 数据库视图允许您创建只读视图,以将只读数据公开给特定用户。 用户只能以只读视图检索数据,但无法更新。

    数据库视图启用计算列。 数据库表不应该具有计算列,但数据库视图可以这样。 假设在orderDetails表中有quantityOrder(产品的数量)和priceEach(产品的价格)列。 但是,orderDetails表没有一个列用来存储订单的每个订单项的总销售额。如果有,数据库模式不是一个好的设计。 在这种情况下,您可以创建一个名为total的计算列,该列是quantityOrder和priceEach的乘积,以表示计算结果。当您从数据库视图中查询数据时,计算列的数据将随机计算产生。

    数据库视图实现向后兼容。 假设你有一个中央数据库,许多应用程序正在使用它。 有一天,您决定重新设计数据库以适应新的业务需求。删除一些表并创建新的表,并且不希望更改影响其他应用程序。在这种情况下,可以创建与将要删除的旧表相同的模式的数据库视图。

    4、视图的缺点

    性能:从数据库视图查询数据可能会很慢,特别是如果视图是基于其他视图创建的。

    表依赖关系:将根据数据库的基础表创建一个视图。每当更改与其相关联的表的结构时,都必须更改视图。

    5、视图实例1-创建视图及查询数据操作

    现有三张表:用户(user)、课程(course)、用户课程中间表(user_course),表结构及数据如下:

    表定义:

    8f900a89c6347c561fdf2122f13be562.png

    961ddebeb323a10fe0623af514929fc1.png

    --------------------------------Table structure for `course`------------------------------

    DROP TABLE IF EXISTS`course`;CREATE TABLE`course` (

    `id`bigint(20) NOT NULLAUTO_INCREMENT,

    `name`varchar(200) NOT NULL,

    `description`varchar(500) NOT NULL,PRIMARY KEY(`id`)

    ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;--------------------------------Records of course------------------------------

    INSERT INTO `course` VALUES ('1', 'JAVA', 'JAVA课程');INSERT INTO `course` VALUES ('2', 'C++', 'C++课程');INSERT INTO `course` VALUES ('3', 'C语言', 'C语言课程');--------------------------------Table structure for `user`------------------------------

    DROP TABLE IF EXISTS `user`;CREATE TABLE `user` (

    `id`bigint(20) NOT NULLAUTO_INCREMENT,

    `account`varchar(255) NOT NULL,

    `name`varchar(255) NOT NULL,

    `address`varchar(255) DEFAULT NULL,

    `others`varchar(200) DEFAULT NULL,

    `others2`varchar(200) DEFAULT NULL,PRIMARY KEY(`id`)

    ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;--------------------------------Records of user------------------------------

    INSERT INTO `user` VALUES ('1', 'user1', '小陈', '美国', '1', '1');INSERT INTO `user` VALUES ('2', 'user2', '小张', '日本', '2', '2');INSERT INTO `user` VALUES ('3', 'user3', '小王', '中国', '3', '3');--------------------------------Table structure for `user_course`------------------------------

    DROP TABLE IF EXISTS`user_course`;CREATE TABLE`user_course` (

    `id`bigint(20) NOT NULLAUTO_INCREMENT,

    `userid`bigint(20) NOT NULL,

    `courseid`bigint(20) NOT NULL,PRIMARY KEY(`id`)

    ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;--------------------------------Records of user_course------------------------------

    INSERT INTO `user_course` VALUES ('1', '1', '2');INSERT INTO `user_course` VALUES ('2', '1', '3');INSERT INTO `user_course` VALUES ('3', '2', '1');INSERT INTO `user_course` VALUES ('4', '2', '2');INSERT INTO `user_course` VALUES ('5', '2', '3');INSERT INTO `user_course` VALUES ('6', '3', '2');

    View Code

    表数据:

    50cb6864528123b0f77ab9cd234e27c5.png

    这时,当我们想要查询小张上的所以课程相关信息的时候,需要这样写一条长长的SQL语句,如下:

    SELECT`uc`.`id`AS`id`,

    `u`.`name`AS`username`,

    `c`.`name`AS`coursename`FROM`user` `u`LEFT JOIN `user_course` `uc` ON ((`u`.`id` =`uc`.`userid`))LEFT JOIN `course` `c` ON ((`uc`.`courseid` =`c`.`id`))WHEREu.`name`= '小张'

    但是我们可以通过视图简化操作,例如我们创建视图view_user_course如下:

    --------------------------------View structure for `view_user_course`------------------------------

    DROP VIEW

    IF EXISTS`view_user_course`;CREATE ALGORITHM =UNDEFINED

    DEFINER=`root`@`localhost`

    SQL SECURITY DEFINERVIEW `view_user_course` AS(SELECT`uc`.`id`AS`id`,

    `u`.`name`AS`username`,

    `c`.`name`AS`coursename`FROM(

    (

    `user` `u`LEFT JOIN `user_course` `uc` ON ((`u`.`id` =`uc`.`userid`))

    )LEFT JOIN `course` `c` ON ((`uc`.`courseid` =`c`.`id`))

    )

    );

    几点说明(MySQL中的视图在标准SQL的基础之上做了扩展):

    ALGORITHM=UNDEFINED:指定视图的处理算法;

    DEFINER=`root`@`localhost`:指定视图创建者;

    SQL SECURITY DEFINER:指定视图查询数据时的安全验证方式;

    创建好视图之后,我们可以直接用以下SQL语句在视图上查询小张上的所以课程相关信息,同样可以得到所需结果:

    SELECTvuc.username,

    vuc.coursenameFROMview_user_course vucWHEREvuc.username= '小张'

    6、视图实例2-增删改数据操作

    继续,我们可以尝试在视图view_user_course上做增删改数据操作,如下:

    update view_user_course set username='test',coursename='JAVASCRIPT' where id=3

    遗憾的是操作失败,提示错误信息如下:

    [SQL] update view_user_course set username='test',coursename='JAVASCRIPT' where id=3

    [Err] 1393 - Can not modify more than one base table through a join view 'demo.view_user_course'

    因为不能在一张由多张关联表连接而成的视图上做同时修改两张表的操作;

    那么哪些操作可以在视图上进行呢?

    视图与表是一对一关系情况:如果没有其它约束(如视图中没有的字段,在基本表中是必填字段情况),是可以进行增删改数据操作;

    如我们创建用户关键信息视图view_user_keyinfo,如下:

    --------------------------------View structure for `view_user_keyinfo`------------------------------

    DROP VIEW

    IF EXISTS`view_user_keyinfo`;CREATE ALGORITHM = UNDEFINED DEFINER = `root`@`localhost` SQL SECURITY DEFINER VIEW `view_user_keyinfo` AS SELECT`u`.`id`AS`id`,

    `u`.`account`AS`account`,

    `u`.`name`AS`username`FROM`user` `u`;

    进行增删改操作如下,操作成功(注意user表中的其它字段要允许为空,否则操作失败):

    INSERT INTOview_user_keyinfo (account, username)VALUES('test1', 'test1');

    DELETE

    FROMview_user_keyinfoWHEREusername= 'test1';

    UPDATEview_user_keyinfoSET username = 'updateuser'

    WHEREid= 1

    视图与表是一对多关系情况:如果只修改一张表的数据,且没有其它约束(如视图中没有的字段,在基本表中是必填字段情况),是可以进行改数据操作,如以下语句,操作成功;

    update view_user_course set coursename='JAVA' where id=1;

    update view_user_course set username='test2' where id=3;

    以下操作失败:

    delete from view_user_course where id=3;

    insert into view_user_course(username, coursename) VALUES('2','3');

    参考文章:

    https://www.cnblogs.com/chenpi/p/5133648.html

    https://www.yiibai.com/mysql/introduction-sql-views.html

    展开全文
  • 这次的设计中我采用了MVC的开发模式,本地获取了数据然后封装,实现的功能是修改表视图中的评分数据,然后刷新表格显示修改后的数据,我认为实现视图的代码中要注意的点有:1、确定设置了tableView的数据源...


    代码如下:

    #pragma mark - 数据刷新

    - (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

        //拿到需要改变的数据

        Film *dataFilm = _dataArray[indexPath.row];

        //创建弹窗

        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"修改数据" message:nil delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];

        //弹窗样式

        alert.alertViewStyle = UIAlertViewStylePlainTextInput;

        UITextField *text = [alert textFieldAtIndex:0];

        //把当前的电影评分数据显示到文本框中

        text.text = dataFilm.rate;

        alert.tag = indexPath.row;

        [alert show];

    }

    //修改数据完成刷新操作

    - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {

        //修改数据

        //如果选中的是取消,那么就返回,不做任何操作

        if (buttonIndex == 0) {

            return;

        }

        Film *film = _dataArray[alertView.tag];

        //拿到当前弹窗中的数据

        UITextField *text = [alertView textFieldAtIndex:0];

        film.rate = text.text;

        //刷新数据指定行

        NSIndexPath *index = [NSIndexPath indexPathForRow:alertView.tag inSection:0];

        [self.tableView reloadRowsAtIndexPaths:@[index] withRowAnimation:UITableViewRowAnimationRight];

        

    }

    全部代码下载链接:http://note.youdao.com/yws/public/redirect/share?id=0e7c35373e8ec6786b9e416263417272&type=false
    展开全文
  • 作者:sirfei来源:blog.csdn.net/sirfei/article/details/4349941. 原始单据与实体之间关系可以是一对一、一对多、多对多关系。一般情况下,它们是...这里实体可以理解为基本。明确这种对应关系后,对我...
    ccf612cc2855ae8bf03f953375c3cb97.png
    作者:sirfei来源:blog.csdn.net/sirfei/article/details/434994

    1. 原始单据与实体之间的关系

    可以是一对一、一对多、多对多的关系。在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体。在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对应多个实体,或多张原始单证对应一个实体。

    这里的实体可以理解为基本表。明确这种对应关系后,对我们设计录入界面大有好处。

    〖例1〗:一份员工履历资料,在人力资源信息系统中,就对应三个基本表:员工基本情况表、社会关系表、工作简历表。这就是“一张原始单证对应多个实体”的典型例子。

    2. 主键与外键

    一般而言,一个实体不能既无主键又无外键。在E—R 图中, 处于叶子部位的实体, 可以定义主键,也可以不定义主键(因为它无子孙), 但必须要有外键(因为它有父亲)。

    主键与外键的设计,在全局数据库的设计中,占有重要地位。当全局数据库的设计完成以后,有个美国数据库设计专家说:“键,到处都是键,除了键之外,什么也没有”,这就是他的数据库设计经验之谈,也反映了他对信息系统核心(数据模型)的高度抽象思想。

    因为:主键是实体的高度抽象,主键与外键的配对,表示实体之间的连接。

    3. 基本表的性质

    基本表与中间表、临时表不同,因为它具有如下四个特性:

    • 原子性。基本表中的字段是不可再分解的。
    • 原始性。基本表中的记录是原始数据(基础数据)的记录。
    • 演绎性。由基本表与代码表中的数据,可以派生出所有的输出数据。
    • 稳定性。基本表的结构是相对稳定的,表中的记录是要长期保存的。

    理解基本表的性质后,在设计数据库时,就能将基本表与中间表、临时表区分开来。

    4. 范式标准

    基本表及其字段之间的关系, 应尽量满足第三范式。但是,满足第三范式的数据库设计,往往不是最好的设计。为了提高数据库的运行效率,常常需要降低范式标准:适当增加冗余,达到以空间换时间的目的。

    〖例2〗:有一张存放商品的基本表,如表1所示。“金额”这个字段的存在,表明该表的设计不满足第三范式,因为“金额”可以由“单价”乘以“数量”得到,说明“金额”是冗余字段。但是,增加“金额”这个冗余字段,可以提高查询统计的速度,这就是以空间换时间的作法。

    在Rose 2002中,规定列有两种类型:数据列和计算列。“金额”这样的列被称为“计算列”,而“单价”和“数量”这样的列被称为“数据列”。

    表1 商品表的表结构

     商品名称 商品型号 单价 数量 金额 电视机 29吋 2,500 40 100,000

    5. 通俗地理解三个范式

    通俗地理解三个范式,对于数据库设计大有好处。在数据库设计中,为了更好地应用三个范式,就必须通俗地理解三个范式(通俗地理解是够用的理解,并不是最科学最准确的理解):

    • 第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;
    • 第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;
    • 第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。

    没有冗余的数据库设计可以做到。但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。

    具体做法是:在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余。

    6. 要善于识别与正确处理多对多的关系

    若两个实体之间存在多对多的关系,则应消除这种关系。消除的办法是,在两者之间增加第三个实体。这样,原来一个多对多的关系,现在变为两个一对多的关系。要将原来两个实体的属性合理地分配到三个实体中去。

    这里的第三个实体,实质上是一个较复杂的关系,它对应一张基本表。一般来讲,数据库设计工具不能识别多对多的关系,但能处理多对多的关系。

    〖例3〗:在“图书馆信息系统”中,“图书”是一个实体,“读者”也是一个实体。这两个实体之间的关系,是一个典型的多对多关系:一本图书在不同时间可以被多个读者借阅,一个读者又可以借多本图书。为此,要在二者之间增加第三个实体,该实体取名为“借还书”,它的属性为:借还时间、借还标志(0表示借书,1表示还书),另外,它还应该有两个外键(“图书”的主键,“读者”的主键),使它能与“图书”和“读者”连接。

    7. 主键PK的取值方法

    PK是供程序员使用的表间连接工具,可以是一无物理意义的数字串, 由程序自动加1来实现。也可以是有物理意义的字段名或字段名的组合。不过前者比后者好。当PK是字段名的组合时,建议字段的个数不要太多,多了不但索引占用空间大,而且速度也慢。

    8. 正确认识数据冗余

    主键与外键在多表中的重复出现, 不属于数据冗余,这个概念必须清楚,事实上有许多人还不清楚。非键字段的重复出现, 才是数据冗余!而且是一种低级冗余,即重复性的冗余。高级冗余不是字段的重复出现,而是字段的派生出现。

    〖例4〗:商品中的“单价、数量、金额”三个字段,“金额”就是由“单价”乘以“数量”派生出来的,它就是冗余,而且是一种高级冗余。冗余的目的是为了提高处理速度。只有低级冗余才会增加数据的不一致性,因为同一数据,可能从不同时间、地点、角色上多次录入。因此,我们提倡高级冗余(派生性冗余),反对低级冗余(重复性冗余)。

    9. E--R图没有标准答案

    信息系统的E--R图没有标准答案,因为它的设计与画法不是惟一的,只要它覆盖了系统需求的业务范围和功能内容,就是可行的。反之要修改E--R图。

    尽管它没有惟一的标准答案,并不意味着可以随意设计。好的E—R图的标准是:结构清晰、关联简洁、实体个数适中、属性分配合理、没有低级冗余。

    10. 视图技术在数据库设计中很有用

    与基本表、代码表、中间表不同,视图是一种虚表,它依赖数据源的实表而存在。视图是供程序员使用数据库的一个窗口,是基表数据综合的一种形式, 是数据处理的一种方法,是用户数据保密的一种手段。

    为了进行复杂处理、提高运算速度和节省存储空间, 视图的定义深度一般不得超过三层。若三层视图仍不够用, 则应在视图上定义临时表, 在临时表上再定义视图。这样反复交迭定义, 视图的深度就不受限制了。

    对于某些与国家政治、经济、技术、军事和安全利益有关的信息系统,视图的作用更加重要。这些系统的基本表完成物理设计之后,立即在基本表上建立第一层视图,这层视图的个数和结构,与基本表的个数和结构是完全相同。并且规定,所有的程序员,一律只准在视图上操作。

    只有数据库管理员,带着多个人员共同掌握的“安全钥匙”,才能直接在基本表上操作。请读者想想:这是为什么?

    11. 中间表、报表和临时表

    中间表是存放统计数据的表,它是为数据仓库、输出报表或查询结果而设计的,有时它没有主键与外键(数据仓库除外)。临时表是程序员个人设计的,存放临时记录,为个人所用。基表和中间表由DBA维护,临时表由程序员自己用程序自动维护。

    12. 完整性约束表现在三个方面

    域的完整性:用Check来实现约束,在数据库设计工具中,对字段的取值范围进行定义时,有一个Check按钮,通过它定义字段的值城。

    参照完整性:用PK、FK、表级触发器来实现。用户定义完整性:它是一些业务规则,用存储过程和触发器来实现。

    13. 防止数据库设计打补丁的方法是“三少原则”

    1、一个数据库中表的个数越少越好。只有表的个数少了,才能说明系统的E--R图少而精,去掉了重复的多余的实体,形成了对客观世界的高度抽象,进行了系统的数据集成,防止了打补丁式的设计;

    2、一个表中组合主键的字段个数越少越好。因为主键的作用,一是建主键索引,二是做为子表的外键,所以组合主键的字段个数少了,不仅节省了运行时间,而且节省了索引存储空间;

    3、一个表中的字段个数越少越好。只有字段的个数少了,才能说明在系统中不存在数据重复,且很少有数据冗余,更重要的是督促读者学会“列变行”,这样就防止了将子表中的字段拉入到主表中去,在主表中留下许多空余的字段。所谓“列变行”,就是将主表中的一部分内容拉出去,另外单独建一个子表。这个方法很简单,有的人就是不习惯、不采纳、不执行。

    数据库设计的实用原则是:在数据冗余和处理速度之间找到合适的平衡点。“三少”是一个整体概念,综合观点,不能孤立某一个原则。

    该原则是相对的,不是绝对的。“三多”原则肯定是错误的。试想:若覆盖系统同样的功能,一百个实体(共一千个属性) 的E--R图,肯定比二百个实体(共二千个属性)的E--R图,要好得多。

    提倡“三少”原则,是叫读者学会利用数据库设计技术进行系统的数据集成。数据集成的步骤是将文件系统集成为应用数据库,将应用数据库集成为主题数据库,将主题数据库集成为全局综合数据库。

    集成的程度越高,数据共享性就越强,信息孤岛现象就越少,整个企业信息系统的全局E—R图中实体的个数、主键的个数、属性的个数就会越少。

    提倡“三少”原则的目的,是防止读者利用打补丁技术,不断地对数据库进行增删改,使企业数据库变成了随意设计数据库表的“垃圾堆”,或数据库表的“大杂院”,最后造成数据库中的基本表、代码表、中间表、临时表杂乱无章,不计其数,导致企事业单位的信息系统无法维护而瘫痪。

    “三多”原则任何人都可以做到,该原则是“打补丁方法”设计数据库的歪理学说。“三少”原则是少而精的原则,它要求有较高的数据库设计技巧与艺术,不是任何人都能做到的,因为该原则是杜绝用“打补丁方法”设计数据库的理论依据。

    14. 提高数据库运行效率的办法

    在给定的系统硬件和系统软件条件下,提高数据库系统的运行效率的办法是:

    • 在数据库物理设计时,降低范式,增加冗余, 少用触发器, 多用存储过程。
    • 当计算非常复杂、而且记录条数非常巨大时(例如一千万条),复杂计算要先在数据库外面,以文件系统方式用C++语言计算处理完成之后,最后才入库追加到表中去。这是电信计费系统设计的经验。
    • 发现某个表的记录太多,例如超过一千万条,则要对该表进行水平分割。水平分割的做法是,以该表主键PK的某个值为界线,将该表的记录水平分割为两个表。若发现某个表的字段太多,例如超过八十个,则垂直分割该表,将原来的一个表分解为两个表。
    • 对数据库管理系统DBMS进行系统优化,即优化各种系统参数,如缓冲区个数。
    • 在使用面向数据的SQL语言进行程序设计时,尽量采取优化算法。

    总之,要提高数据库的运行效率,必须从数据库系统级优化、数据库设计级优化、程序实现级优化,这三个层次上同时下功夫。

    上述十四个技巧,是许多人在大量的数据库分析与设计实践中,逐步总结出来的。对于这些经验的运用,读者不能生帮硬套,死记硬背,而要消化理解,实事求是,灵活掌握。并逐步做到:在应用中发展,在发展中应用。

    展开全文
  • 如题,用access2010给数据表创建了分割窗体,但切换成设计视图后,为什么只有上半部分窗体视图而没有下半部分数据视图? 同样,为方便多窗口统一管理,将此分割窗体加入到 “窗体”选项卡->“导航”->"水平...
  • 出处:blog.csdn.net/sirfei/article/details/4349941. 原始单据与实体之间关系可以是一对一、一对多、多对多关系。一般情况下,它们是一对...这里实体可以理解为基本。明确这种对应关系后,对我们设计录...

    286b1ab52eafadff21f6fb3c9b56029f.png

    出处:blog.csdn.net/sirfei/article/details/434994


    1. 原始单据与实体之间的关系

    可以是一对一、一对多、多对多的关系。在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体。在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对应多个实体,或多张原始单证对应一个实体。

    这里的实体可以理解为基本表。明确这种对应关系后,对我们设计录入界面大有好处。

    〖例1〗:一份员工履历资料,在人力资源信息系统中,就对应三个基本表:员工基本情况表、社会关系表、工作简历表。这就是“一张原始单证对应多个实体”的典型例子。

    2. 主键与外键

    一般而言,一个实体不能既无主键又无外键。在E—R 图中, 处于叶子部位的实体, 可以定义主键,也可以不定义主键(因为它无子孙), 但必须要有外键(因为它有父亲)。

    主键与外键的设计,在全局数据库的设计中,占有重要地位。当全局数据库的设计完成以后,有个美国数据库设计专家说:“键,到处都是键,除了键之外,什么也没有”,这就是他的数据库设计经验之谈,也反映了他对信息系统核心(数据模型)的高度抽象思想。

    因为:主键是实体的高度抽象,主键与外键的配对,表示实体之间的连接。

    3. 基本表的性质

    基本表与中间表、临时表不同,因为它具有如下四个特性:

    • 原子性。基本表中的字段是不可再分解的。

    • 原始性。基本表中的记录是原始数据(基础数据)的记录。

    • 演绎性。由基本表与代码表中的数据,可以派生出所有的输出数据。

    • 稳定性。基本表的结构是相对稳定的,表中的记录是要长期保存的。

    理解基本表的性质后,在设计数据库时,就能将基本表与中间表、临时表区分开来。

    4. 范式标准

    基本表及其字段之间的关系, 应尽量满足第三范式。但是,满足第三范式的数据库设计,往往不是最好的设计。为了提高数据库的运行效率,常常需要降低范式标准:适当增加冗余,达到以空间换时间的目的。

    〖例2〗:有一张存放商品的基本表,如表1所示。“金额”这个字段的存在,表明该表的设计不满足第三范式,因为“金额”可以由“单价”乘以“数量”得到,说明“金额”是冗余字段。但是,增加“金额”这个冗余字段,可以提高查询统计的速度,这就是以空间换时间的作法。

    在Rose 2002中,规定列有两种类型:数据列和计算列。“金额”这样的列被称为“计算列”,而“单价”和“数量”这样的列被称为“数据列”。

    90c3d9045a978a9f681370d385e9238e.png

    表1 商品表的表结构

    5. 通俗地理解三个范式

    通俗地理解三个范式,对于数据库设计大有好处。在数据库设计中,为了更好地应用三个范式,就必须通俗地理解三个范式(通俗地理解是够用的理解,并不是最科学最准确的理解):

    • 第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;

    • 第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;

    • 第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。

    没有冗余的数据库设计可以做到。但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。

    具体做法是:在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余。

    6. 要善于识别与正确处理多对多的关系

    若两个实体之间存在多对多的关系,则应消除这种关系。消除的办法是,在两者之间增加第三个实体。这样,原来一个多对多的关系,现在变为两个一对多的关系。要将原来两个实体的属性合理地分配到三个实体中去。

    这里的第三个实体,实质上是一个较复杂的关系,它对应一张基本表。一般来讲,数据库设计工具不能识别多对多的关系,但能处理多对多的关系。

    〖例3〗:在“图书馆信息系统”中,“图书”是一个实体,“读者”也是一个实体。这两个实体之间的关系,是一个典型的多对多关系:一本图书在不同时间可以被多个读者借阅,一个读者又可以借多本图书。

    为此,要在二者之间增加第三个实体,该实体取名为“借还书”,它的属性为:借还时间、借还标志(0表示借书,1表示还书),另外,它还应该有两个外键(“图书”的主键,“读者”的主键),使它能与“图书”和“读者”连接。

    7. 主键PK的取值方法

    PK是供程序员使用的表间连接工具,可以是一无物理意义的数字串, 由程序自动加1来实现。也可以是有物理意义的字段名或字段名的组合。不过前者比后者好。当PK是字段名的组合时,建议字段的个数不要太多,多了不但索引占用空间大,而且速度也慢。

    8. 正确认识数据冗余

    主键与外键在多表中的重复出现, 不属于数据冗余,这个概念必须清楚,事实上有许多人还不清楚。非键字段的重复出现, 才是数据冗余!而且是一种低级冗余,即重复性的冗余。高级冗余不是字段的重复出现,而是字段的派生出现。

    〖例4〗:商品中的“单价、数量、金额”三个字段,“金额”就是由“单价”乘以“数量”派生出来的,它就是冗余,而且是一种高级冗余。冗余的目的是为了提高处理速度。

    只有低级冗余才会增加数据的不一致性,因为同一数据,可能从不同时间、地点、角色上多次录入。因此,我们提倡高级冗余(派生性冗余),反对低级冗余(重复性冗余)。

    9. E--R图没有标准答案

    信息系统的E--R图没有标准答案,因为它的设计与画法不是惟一的,只要它覆盖了系统需求的业务范围和功能内容,就是可行的。反之要修改E--R图。

    尽管它没有惟一的标准答案,并不意味着可以随意设计。好的E—R图的标准是:结构清晰、关联简洁、实体个数适中、属性分配合理、没有低级冗余。

    10. 视图技术在数据库设计中很有用

    与基本表、代码表、中间表不同,视图是一种虚表,它依赖数据源的实表而存在。视图是供程序员使用数据库的一个窗口,是基表数据综合的一种形式, 是数据处理的一种方法,是用户数据保密的一种手段。

    为了进行复杂处理、提高运算速度和节省存储空间, 视图的定义深度一般不得超过三层。若三层视图仍不够用, 则应在视图上定义临时表, 在临时表上再定义视图。这样反复交迭定义, 视图的深度就不受限制了。

    对于某些与国家政治、经济、技术、军事和安全利益有关的信息系统,视图的作用更加重要。这些系统的基本表完成物理设计之后,立即在基本表上建立第一层视图,这层视图的个数和结构,与基本表的个数和结构是完全相同。并且规定,所有的程序员,一律只准在视图上操作。

    只有数据库管理员,带着多个人员共同掌握的“安全钥匙”,才能直接在基本表上操作。请读者想想:这是为什么?

    11. 中间表、报表和临时表

    中间表是存放统计数据的表,它是为数据仓库、输出报表或查询结果而设计的,有时它没有主键与外键(数据仓库除外)。临时表是程序员个人设计的,存放临时记录,为个人所用。基表和中间表由DBA维护,临时表由程序员自己用程序自动维护。

    12. 完整性约束表现在三个方面

    域的完整性:用Check来实现约束,在数据库设计工具中,对字段的取值范围进行定义时,有一个Check按钮,通过它定义字段的值城。

    参照完整性:用PK、FK、表级触发器来实现。用户定义完整性:它是一些业务规则,用存储过程和触发器来实现。

    13. 防止数据库设计打补丁的方法是“三少原则”

    1、一个数据库中表的个数越少越好。只有表的个数少了,才能说明系统的E--R图少而精,去掉了重复的多余的实体,形成了对客观世界的高度抽象,进行了系统的数据集成,防止了打补丁式的设计;

    2、一个表中组合主键的字段个数越少越好。因为主键的作用,一是建主键索引,二是做为子表的外键,所以组合主键的字段个数少了,不仅节省了运行时间,而且节省了索引存储空间;

    3、一个表中的字段个数越少越好。只有字段的个数少了,才能说明在系统中不存在数据重复,且很少有数据冗余,更重要的是督促读者学会“列变行”,这样就防止了将子表中的字段拉入到主表中去,在主表中留下许多空余的字段。所谓“列变行”,就是将主表中的一部分内容拉出去,另外单独建一个子表。这个方法很简单,有的人就是不习惯、不采纳、不执行。

    数据库设计的实用原则是:在数据冗余和处理速度之间找到合适的平衡点。“三少”是一个整体概念,综合观点,不能孤立某一个原则。

    该原则是相对的,不是绝对的。“三多”原则肯定是错误的。试想:若覆盖系统同样的功能,一百个实体(共一千个属性) 的E--R图,肯定比二百个实体(共二千个属性)的E--R图,要好得多。

    提倡“三少”原则,是叫读者学会利用数据库设计技术进行系统的数据集成。数据集成的步骤是将文件系统集成为应用数据库,将应用数据库集成为主题数据库,将主题数据库集成为全局综合数据库。

    集成的程度越高,数据共享性就越强,信息孤岛现象就越少,整个企业信息系统的全局E—R图中实体的个数、主键的个数、属性的个数就会越少。

    提倡“三少”原则的目的,是防止读者利用打补丁技术,不断地对数据库进行增删改,使企业数据库变成了随意设计数据库表的“垃圾堆”,或数据库表的“大杂院”,最后造成数据库中的基本表、代码表、中间表、临时表杂乱无章,不计其数,导致企事业单位的信息系统无法维护而瘫痪。

    “三多”原则任何人都可以做到,该原则是“打补丁方法”设计数据库的歪理学说。“三少”原则是少而精的原则,它要求有较高的数据库设计技巧与艺术,不是任何人都能做到的,因为该原则是杜绝用“打补丁方法”设计数据库的理论依据。

    14. 提高数据库运行效率的办法

    在给定的系统硬件和系统软件条件下,提高数据库系统的运行效率的办法是:

    • 在数据库物理设计时,降低范式,增加冗余, 少用触发器, 多用存储过程。

    • 当计算非常复杂、而且记录条数非常巨大时(例如一千万条),复杂计算要先在数据库外面,以文件系统方式用C++语言计算处理完成之后,最后才入库追加到表中去。这是电信计费系统设计的经验。

    • 发现某个表的记录太多,例如超过一千万条,则要对该表进行水平分割。水平分割的做法是,以该表主键PK的某个值为界线,将该表的记录水平分割为两个表。若发现某个表的字段太多,例如超过八十个,则垂直分割该表,将原来的一个表分解为两个表。

    • 对数据库管理系统DBMS进行系统优化,即优化各种系统参数,如缓冲区个数。

    • 在使用面向数据的SQL语言进行程序设计时,尽量采取优化算法。

    总之,要提高数据库的运行效率,必须从数据库系统级优化、数据库设计级优化、程序实现级优化,这三个层次上同时下功夫。

    上述十四个技巧,是许多人在大量的数据库分析与设计实践中,逐步总结出来的。对于这些经验的运用,读者不能生帮硬套,死记硬背,而要消化理解,实事求是,灵活掌握。并逐步做到:在应用中发展,在发展中应用。

    (完)

    长按打开更多惊喜532e7d670273bec09c8e4c95bd4b75b0.png

    0715b443ccfc47659840b7510aec1a2a.png

    展开全文
  • 一、数据类型 这个表格给字段: ...使用过程,存数量不同 通用设定形式 定义一个字段时候类型写法。 比如: create table tab1 (f1 数据类型 ); f1代表表头 数据类型: 类型名[(长度n...
  • 1. 原始单据与实体之间关系可以是一对一、一对多、多对多关系。一般情况下,它们是一对一关系:即一张原始单据...〖例1〗:一份员工履历资料,人力资源信息系统,就对应三个基本:员工基本情况、社...
  • ASP.NET MVC4数据库操作实例之前文章介绍了MVC4与Pure框架结合进行网页设计过程如何定义控制器、方法、模型、视图等。并使用实例进行了简单说明。本文将此基础上进一步说明如何使用MVC4实现与数据库连接,并...
  • 1. 原始单据与实体之间关系可以是一对一、一对多、多对多关系。一般情况下,它们是一对一关系:即一张原始单据...〖例1〗:一份员工履历资料,人力资源信息系统,就对应三个基本:员工基本情况、社...
  • 1. 原始单据与实体之间关系可以是一对一、一对多、多对多关系。一般情况下,它们是一对一关系:即一张原始单据对应且只...〖例1〗:一份员工履历资料,人力资源信息系统,就对应三个基本:员工基本...
  • 【判断题】“数字”类型用于存储可以进行数学运算的数据。...【单选题】下列不属于时间日期类型是_______【判断题】查询设计视图,既可以创建不带条件查询,也可以创建带条件查询。【单选题】创建数据...
  • 设计完数据库后就可以数据库创建存储数据的表数据通常存储于基本表中,每 个至多可定义 1024 列。和列名称必须遵守标识符规定,特定表中必须是唯一 ,但同一数据库不同表中可使用相同列名。 ...
  • 背景:博主做项目过程遇到这样一个问题。 数据库建表模型: 如图可以看到,用户泛化为住户与服务人员,泛化后根据自己特性,生成...依据数据结构设计原则,将外键放置住户,服务人员表中=>(user...
  • 数据库是基本对象,数据库中的数据就是存储在表空间中的容器的表视图是不占用存储空间视图只是基本或者其它视图或者这两者组合一个逻辑映像而已。是为了方便用户或者应用程序使用基本表中...
  • 一、简介 以数据库为中心的应用程序,主/从数据表视图是一种非常常见的设计模式。这种模式下,顶级数据(主表)显示一个用户界面元素(如Data Grid),而与之相关的细节数据(从表)则根据主表的选择作...
  • 数据库是基本对象,数据库中的数据就是存储在表空间中的容器的表视图是不占用存储空间视图只是基本或者其它视图或者这两者组合一个逻辑映像而已。是为了方便用户或者应用程序使用基本...
  • 主要学习与运行效果 本节内容中,我们将通过一个具体实例实现过程,详细讲解在表视图当中,如何创建一个可展开可...4.将数据显示在表视图中 5.实现表格展开、收缩效果 运行效果如下所示: 视图...
  • iOS开发那些事-表视图UI设计模式

    千次阅读 2013-03-05 13:18:14
    由于视图应用iOS中极其广泛,本节向大家介绍表视图中两个UI设计模式:分页模式和下拉刷新(Pull-to-Refresh)模式。这两种模式已经成为移动平台开发标准。 分页模式  分页模式规范了移动平台进行大量...
  • 1、利用表的“数据视图”创建如右图的“学生-数据视图”表知识要点:1、如何利用表的数据视图创建数据表。2、注意利用数据视图创建表时,字段数据类型的默认情况。操作说明: 上节向同学们介绍了ACCESS中表的基本的...
  • 设计时,字段有一个“有效性规则”属性,我们可以其中通过表达式来对输入到该字段的数据进行限制。但字段“有效性规则”属性只能应用于...打开属性对话框方法是:在表设计视图中点击工具栏中属性按钮...
  • 今天迁移服务器过过程,遇到同帐号可以访问数据表,却无权限访问视图?百思不得其解,因为原来旧服务器没有这问题呀。 于是网上各种查,终没有找到答案。 算了,还是自己摸索下。 于是用Navicat查mysql帐号...
  • SQLServer中的视图介绍

    2017-01-10 10:00:01
    在数据查询,可以看到数据表设计过程,考虑到数据的冗余度低、数据一致性等问题,通常对数据表的设计要满足范式的要求,因此也会造成一个实体的所有信息保存在多个表。当检索数据时,往往在一个表不能够得到...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,762
精华内容 704
关键字:

在数据表的设计视图中