精华内容
下载资源
问答
  • 原文:传递数据库 'model' 中的日志扫描操作的日志扫描号无效 状况描述:在服务器的管理中重新启动MSSQLSERVER启动后马上又停止 通过"事件查看器" 发现 错误: 9003,严重度: 20,状态: 1 LSN(...

    原文:传递给数据库 'model' 中的日志扫描操作的日志扫描号无效

    状况描述:在服务器的管理中重新启动MSSQLSERVER启动后马上又停止
     
    通过"事件查看器" 发现
    错误:   9003,严重度:  20,状态:   1   
              LSN(5:324:1)无效。该 LSN 是传递给数据库'model' 中的日志扫描操作。                 
    错误:   9003,严重度:   20,状态:   1   
              The LSN (5:324:1) passed to log scan in database  'model' is invalid. 

    解决方法:

    1.备份C:\Program Files\Microsoft SQL Server\MSSQL\Data(SQL2014:D:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA
    目录下 Model.mdf  ,   modellog.ldf  两个文件
    2.找来Sql Server安装盘,将X86\Data\ Model.mdf,ModelLog.ldf两个文件复到C:\Program Files\Microsoft SQL Server\MSSQL\Data目录下,
      将Model.mdf,modellog.ldf两个文件覆盖。
    3.重新启动SQL SERVER 成功!
    posted on 2017-07-12 23:59 NET未来之路 阅读(...) 评论(...) 编辑 收藏

    转载于:https://www.cnblogs.com/lonelyxmas/p/7158274.html

    展开全文
  • 原文:传递数据库 'model' 中的日志扫描操作的日志扫描号无效 状况描述:在服务器的管理中重新启动MSSQLSERVER启动后马上又停止 通过"事件查看器" 发现 错误: 9003,严重度: 20,状态: 1 LSN(5:324:1)无效。...

    原文:传递给数据库 'model' 中的日志扫描操作的日志扫描号无效

    状况描述:在服务器的管理中重新启动MSSQLSERVER启动后马上又停止
     
    通过"事件查看器" 发现
    错误:   9003,严重度:  20,状态:   1   
              LSN(5:324:1)无效。该 LSN 是传递给数据库'model' 中的日志扫描操作。                 
    错误:   9003,严重度:   20,状态:   1   
              The LSN (5:324:1) passed to log scan in database  'model' is invalid. 

    解决方法:

    1.备份C:\Program Files\Microsoft SQL Server\MSSQL\Data(SQL2014:D:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA
    目录下 Model.mdf  ,   modellog.ldf  两个文件
    2.找来Sql Server安装盘,将X86\Data\ Model.mdf,ModelLog.ldf两个文件复到C:\Program Files\Microsoft SQL Server\MSSQL\Data目录下,
      将Model.mdf,modellog.ldf两个文件覆盖。
    3.重新启动SQL SERVER 成功!
    展开全文
  • 官方原文Realm 文件可以通过传递一个512位(64字节)的密钥参数给 Realm.getInstance().encryptionKey() 来加密存储在磁盘上。byte[] key = new byte[64]; new SecureRandom().nextBytes(key); Rea

    Realm数据库使用教程(六):数据迁移

    数据库加密

    Realm自带数据库加密,需要64位字节数据进行加密。

    • 官方原文

      Realm 文件可以通过传递一个512位(64字节)的密钥参数给 Realm.getInstance().encryptionKey() 来加密存储在磁盘上。
      
    byte[] key = new byte[64];
    new SecureRandom().nextBytes(key);
    RealmConfiguration config = new RealmConfiguration.Builder()
      .encryptionKey(key)
      .build();
    Realm realm = Realm.getInstance(config);
    保证了所有永久性存储在磁盘上的数据都是通过标准 AES-256 加密的。每次创建新的 Realm 实例的时候,都需要提供相同的密钥。
    
    • 我的做法

    因为每次创建新的 Realm 实例的时候,都需要提供相同的密钥,所以如果使用官方随机产生的话,第二次打开app数据库可能会禁止访问!

    创建一个16字节的key

    private static String key = "huangxiaoguo1234";

    转换为64位

      /**
         * 获取Realm数据库64位秘钥
         *
         * @param key
         * @return
         */
        public static byte[] getRealmKey(String key) {
            String newKey = "";
            for (int i = 0; i < 4; i++) {
                newKey = newKey + key;
            }
            return newKey.getBytes();
        }
    

    指定数据库的密钥

    package tsou.com.simple.realmtest;
    
    import android.app.Application;
    import android.content.Context;
    
    import com.facebook.stetho.Stetho;
    import com.uphyca.stetho_realm.RealmInspectorModulesProvider;
    
    import java.security.SecureRandom;
    
    import io.realm.Realm;
    import io.realm.RealmConfiguration;
    import tsou.com.simple.realmtest.migration.CustomMigration;
    import tsou.com.simple.realmtest.utils.UIUtils;
    
    /**
     * Created by Administrator on 2017/12/15 0015.
     */
    
    public class MyApplication extends Application {
    
        /**
         * 上下文
         */
        private static MyApplication instance;
        private static RealmConfiguration config;
        private static String key = "huangxiaoguo1234";
    
        @Override
        public void onCreate() {
            super.onCreate();
            /**
             * 在Realm中Stetho需要配置
             */
            Stetho.initialize(
                    Stetho.newInitializerBuilder(this)
                            .enableDumpapp(Stetho.defaultDumperPluginsProvider(this))
                            .enableWebKitInspector(RealmInspectorModulesProvider.builder(this).build())
                            .build());
    
            Realm.init(this);
            instance = this;
            new SecureRandom().nextBytes(UIUtils.getRealmKey(key));
            config = new RealmConfiguration.Builder()
                    .name("huangxiaoguo.realm")//指定数据库的名称。如不指定默认名为default。
                    .encryptionKey(UIUtils.getRealmKey(key))//指定数据库的密钥。
                    .schemaVersion(1)
    //                .deleteRealmIfMigrationNeeded()//声明版本冲突时自动删除原数据库,开发时候打开
                    .migration(new CustomMigration())//指定迁移操作的迁移类。
    //                .inMemory()// 声明数据库只在内存中持久化
                    .build();
    
    //        mRealm = Realm.getDefaultInstance();
    //        mRealm = Realm.getInstance(config);
        }
    
        public static Context getInstance() {
            return instance;
        }
    
        public static RealmConfiguration getRealmConfiguration() {
            return config;
        }
    
    }
    

    数据库加密完成!


    Realm使用注意事项

    • 线程限制

    eg:

    异步删除:先查找到数据(无效)

     //失败(原因是因为线程限制)
                    final RealmResults<Student> students4 = mRealm.where(Student.class).findAll();
                    realmAsyncTask = mRealm.executeTransactionAsync(new Realm.Transaction() {
                        @Override
                        public void execute(Realm realm) {
                            students4.deleteFromRealm(0);
                            students4.deleteFirstFromRealm();
                            students4.deleteLastFromRealm();
                            students4.deleteAllFromRealm();
                        }
                    }, new Realm.Transaction.OnSuccess() {
                        @Override
                        public void onSuccess() {
                            UIUtils.showToast("删除成功");
                        }
                    }, new Realm.Transaction.OnError() {
                        @Override
                        public void onError(Throwable error) {
                            UIUtils.showToast("删除失败");
                        }
                    });

    deleteAll()(崩溃)

    //崩溃(原因是因为线程限制)
    
     mRealm.deleteAll();

    delete(xxx.class)(崩溃)

    //崩溃(原因是因为线程限制)
    
    mRealm.delete(Student.class);

    Intent:传递对象(崩溃)

    这种做法是不允许的,即使你User实现了Serializable接口
    
    RealmResults<User> users = mRealm.where(User.class).findAll();
                    if (users.size() > 0) {
                        User user = users.get(0);
                        Intent intent = new Intent(this, TestActivity.class);
                        intent.putExtra("user", user);
                        startActivity(intent);
                    }else {
                        UIUtils.showToast("数据库没有数据");
                    }
    

    以上做法均是Realm不允许的做法!

    一、 RealmObject自带线程保护功能,只能在创建它的线程中访问,在子线程中不能访问。
    也就是说,如果你在主线程中new了一个RealmObject对象 user,那么在子线程中是访问不了user对象的。
    要想在子线程中访问,必须先将user存入Ream中,然后在子线程中query出来。

    二、 如果Realm关闭,所有查询得到的RealmObject都不能使用了。
    如果想在子线程中去查询数据,然后在主线程中使用是无法做到的。所以Realm提供的异步查询就很重要了…

    三、如果想在Realm.close()之后继续操作,需要查询得到的对象

    四、如果直接修改或删除query得到的数据,必须在transaction中完成…
    也就是说,你根本不能把query返回的对象,当成普通对象去赋值或删除,如果想要直接操作…,把对象copy一份传出来…

    • Intent:传递主键(重要官方建议)
    
     //你不可以直接通过 intent传递 RealmObject,建议你只传递RealmObject的标识符。
    
                    RealmResults<User> all = mRealm.where(User.class).findAll();
                    if (all.size() > 0) {
                        int id = all.get(0).getId();
                        Intent intent = new Intent(this, TestActivity.class);
                        intent.putExtra("id", id);
                        startActivity(intent);
                    }else {
                        UIUtils.showToast("数据库没有数据");
                    }
    

    然后在下个页面重新查询数据库

    mRealm = UIUtils.getRealmInstance();
     int id = getIntent().getIntExtra("id", -1);
            if (id != -1) {
                user = mRealm.where(User.class).equalTo("id", id).findFirst();
            }
     if (user != null) {
                mText.setText("id=" + user.getId() +
                        ",name=" + user.getName() + ",age="
                        + user.getAge() + ",sex=" + user.getSex());
            }
    • Realm支持Rxjava,但是不太稳定,版本更改后会有部分方法进行替换了,如果有需要可以去尝试!

    作者对Realm的使用介绍到此就告一段落了!有什么不妥之处,望指出,谢谢

    Demo地址:https://gitee.com/huangxiaoguo/Realm

    展开全文
  • 本文参考自最简单的数据库“范式”教程 查看原文: 原文地址 既然都叫最简单的数据库“范式”教程,我觉得它一定要满足这个要求:看完这篇博客,你一定会明白数据库的“范式”和那些诸如“完全函数依赖”,“部分...

    本文参考自最简单的数据库“范式”教程

    查看原文: 原文地址

    既然都叫最简单的数据库“范式”教程,我觉得它一定要满足这个要求:看完这篇博客,你一定会明白数据库的“范式”和那些诸如“完全函数依赖”,“部分函数依赖”,“传递函数依赖”等烦人的概念,前提是你得跟着我的思路认真的读完它,好,准备好你的半个小时了吗?我们开始。

    目录

    1. 什么是范式?
    2. 贯穿全文的一个例子。
    3. 第一范式(1NF)
    4. 几个重要的概念。
    5. 第二范式(2NF)
    6. 第三范式(3NF)
    7. BC范式(BCNF)
    8. 第四范式(4NF)

    1. 什么是范式?

    范式其实就是关系数据库规范程度的级别,举个我们生活中的例子,老师让打扫卫生,最低标准是扫地,二级标准是扫地+擦桌子,三级标准是扫地+擦桌子+擦玻璃,实际上在标准不断上升的过程中,首先高一级的标准是满足低一级标准的,范式也是如此,只不过它的标准描述的是数据库规范化的程度罢了。数据库中的范式有1NF , 2NF , 3NF , BCNF , 4NF,5NF(本文不讨论)。它们之间的关系1NF < 2NF < 3NF < BCNF < 4NF(默认越大 级别越高)。

    2.贯穿全文的一个例子。

    这里写图片描述 
    这个例子有下面的关系

    (学号,课名)->分数 
    学号->姓名 
    学号->系名 
    系名->系主任 
    注:A->B:理解为A属性可以唯一确定B属性。

    这个例子会在说第二范式和第三范式的时候被逐步优化。

    3.第一范式(1NF)

    数据库表的每一列都是不可再分的原子数据项,它是一个关系型数据库的最低标准,如果不满足第一范式,那么这个数据库就不是关系型数据库。如下所示: 
    这里写图片描述 
    这个表我们无法在数据库中直接创建,因为它的这一列,既有系名又有系主任,产生了冲突,如果作出调整,使它符合第一范式,那么应该是这样的: 
    这里写图片描述

    但是即使这样,数据库中还是会存在诸如插入、删除、数据冗余等异常。比如针对下面的表: 
    这里写图片描述

    • 数据冗余:可以看到姓名、系名和系主任这三列冗余非常大。
    • 插入异常:如果目前开设了计算机系,但是尚未招生,那么计算机系是无法插入到表的系名中的,(学号,课名)是主属性,不能为空。
    • 删除异常:如果经济系的学生全部毕业了,在删除所有学生的时候,会将经济系一并删除

    因此这个数据库的设计是有缺陷的,为了优化它,我们继续到第二范式。在说第二范式之前,我们先来说几个重要的概念。

    4.几个重要的概念。

    • 函数依赖:在一张表中,如果给定A属性(或属性组)的值,一定能唯一确定B属性的值,那么就说B依赖于A属性(或属性组),记作A->B,比如给定学号,就能确定姓名,一个学号一定能确定一个姓名,就这么简单,是不是似曾相识?对,我们在第二部分中说那个贯穿全文的例子的时候其实已经用到这个概念了。

    • 完全函数依赖:在函数依赖的基础上,我们的A属性是一个属性组,只有这个属性组中的全部属性才能确定唯一的B属性,A的任何一个子集都不可以。比如(学号,课名)->成绩,而单独的学号或者课名都不能确定成绩,这就叫完全函数依赖。

    • 部分函数依赖:和完全函数依赖相比,A属性组中的部分属性就能确定B属性,其它属性可有可无,比如(学号,课名)->姓名,其实只要学号就可以了,这样的依赖就叫部分函数依赖。

    • 传递函数依赖:如果A->B,B->C,并且B不能->A(防止直接A->C),那么我们可以得出结论A->C,叫做C传递函数依赖A。比如学号->系名,系名->系主任,并且(系名不能决定学号),所以系主任传递函数依赖学号。

    • 码:一个属性或者属性组,使得整个关系中除过此属性或者属性组之外的其余属性都完全函数依赖于它,那它就是码。例如(学号,成绩),它们两个的组合可以将其他所有的属性都决定了,(学号,课名)->分数,学号->姓名,学号->系名,学号->系名->系主任,所以(学号,课名)就是这个关系中的一个码,那这个关系中还有别的码吗? 谁知道呢,但我们的分析过程应该是这样的:从一个属性一直到n个属性全部来一遍。

      1. 一个属性:学号,姓名,系名,系主任,课名,分数。找反例即可:学号不能决定分数,(必须要课名),姓名什么也决定不了,系名只能决定系主任,课名也决定不了什么,分数一样。所以一个属性中肯定是没有码的。
      2. 两个属性:(学号,姓名),(学号,系名),(学号,系主任),(学号,课名),(学号,分数),(姓名,系名),(姓名,系主任),(姓名,课名),(姓名,分数),(系名,系主任),(系名,课名),(系名,分数),(系主任,课名),(系主任,分数),(课名,分数)。呼~终于完了,我们再进行分析,发现只有(学号,课名),这个组合与其他的关系来说是完全函数依赖。也就是它们是一个码。
      3. 三个属性:……
      4. 四个属性:……
      5. 五个属性:……
      6. 六个属性:……

    好吧,只能这样吗?对,只能这样这里写图片描述,其实有一些能减少工作量的方法,比如如果我们在分析两个属性时已经确定(学号,课名)是,那么在以后的分析中,如果包含(学号,课名)的那就一定不是码,因为要完全函数依赖。比如(学号,课名,系名)就不用分析了。其他的方法大家自己总结吧。

    • 主属性:所有的码中包含的属性都是主属性。
    • 非主属性:除过码中包含属性之外的属性。

    呼呼~,返过头再看一遍,我们要向第二范式出发了。

    5. 第二范式(2NF)

    在第一范式基础上,消除非主属性对主属性的部分函数依赖,针对我们的例子,分析如下: 
    主属性:学号,课名 
    非主属性:姓名,系名,系主任,分数

    目前只有一张表: 
    (学号,姓名,系名,系主任,课名,分数)

    明显,姓名和系名都是对(学号,课名)存在部分函数依赖的。因为其实只需要学号就可以决定姓名和系名。所以这个表目前是不符合第二范式的,我们只好对表作出分解,当然分解的模式不是唯一的,下面只是一种情况,如下所示:

    选课(学号,课名,分数) 
    学生(学号,姓名,系名,系主任) 
    这里写图片描述 
    我们此时再来看两张表是否满足第二范式: 
    选课表:主属性:(学号,课名)。非主属性:分数。 不存在非主属性对主属性的部分函数依赖,满足第二范式。 
    学生表:主属性:学号。非主属性:系名,系主任,姓名。因为主属性只有一个,所以一定不存在非主属性对主属性的部分函数依赖。满足第二范式。

    至于怎么找主属性,不用我强调了吧,要是忘了的话回头看看上面。此时数据变成了这样: 
    这里写图片描述

    我们回头看看前面的问题有没有得到改善:

    • 数据冗余问题:姓名、系名、系主任的数据冗余得到了明显改善。
    • 插入异常问题:现在新开设一个系,尚未招生还是无法将系名插入到学生表中,因为学号是主属性,不能为空。没有改善。
    • 删除异常问题:一个系毕业,删除这个系的所有学生信息,那还是会连带删除掉系的信息。没有改善。

    因此,只满足第二范式也还是不够。可以消除部分数据冗余问题,还是存在好多问题。

    6. 第三范式(3NF)

    在第二范式基础上,消除非主属性对主属性的传递函数依赖,同样,我们继续分析我们的例子: 
    主属性:学号,课名 
    非主属性:姓名,系名,系主任,分数

    目前我们的表如下: 
    选课(学号,课名,分数) 
    学生(学号,姓名,系名,系主任)

    我们发现在学生表中:存在非主属性系主任对主属性学号的传递函数依赖。因为学号->系名,系名->系主任,所以才会出现前面那么多的问题。那我们试着再次分解学生表,消除这种传递函数依赖。分解后如下:

    选课(学号,课名,分数) 
    学生(学号,姓名,系名) 
    系(系名,系主任) 
    这里写图片描述

    我们继续分析: 
    选课表中码为(学号,课名),非主属性为分数,它们是完全函数依赖的关系,不存在非主属性对主属性的传递函数依赖。符合第三范式。 
    对于学生表,码为学号,主属性为学号,非主属性为系名,不可能存在非主属性对于码的传递函数依赖,符合第三范式, 
    对于系表,码为系名,主属性为系名,非主属性为系主任,不可能存在非主属性对于码的传递函数依赖(至少要有三个属性才可能存在传递函数依赖关系),也符合第三范式。

    此时数据成了现在这样: 
    这里写图片描述

    我们再回头看看前面的问题有没有得到改善:

    • 插入异常问题:现在新开设一个系,尚未招生我们却可以保存系的信息,因为我们有系这个表。问题得到改善。
    • 删除异常问题:一个系毕业,删除这个系的所有学生信息,现在不会连带删除掉系的信息,因为我们有系这个表。问题得到改善。

    当数据库到达第三范式的时候,基本上有关数据冗余,数据插入、删除、更新的异常问题得到了解决,这也是一个”合法的”数据库最基本的要求,但是效率问题就另当别论了,因为表越多,连接操作就越多,但是连接是一个比较耗资源的操作。对于我们前面的例子,已经优化到最好了,也没有再次优化的地方。下面我们说到BC范式的时候会说另一个例子。

    7. BC范式(BCNF)

    在第三范式基础上,消除主属性对主属性的部分函数依赖与传递函数依赖,什么?没搞错吧?对,没搞错。我们看下面的例子。 
    若: 
    1:某公司有若干个仓库; 
    2:每个仓库只能有一名管理员,一名管理员只能在一个仓库中工作; 
    3:一个仓库中可以存放多种物品,一种物品也可以存放在不同的仓库中。每种物品在每个仓库中都有对应的数量。

    如下所示: 
    这里写图片描述

    属性有:仓库,管理员,物品,数量。 
    我们先来找码:

    • 一个属性:没有
    • 二个属性:(管理员,物品),(仓库,物品)
    • 三个属性:包含两个属性中的了,pass
    • 四个属性:包含两个属性中的了,pass

    我们得到主属性:管理员,物品,仓库 
    非主属性:数量

    不存在数量对主属性的部分函数依赖和传递函数依赖,有的人可能有疑问?明明(仓库,物品)->数量,为什么不是部分函数依赖,是因为我们这里说的主属性是码,此时的三个主属性是由两个码(管理员,物品),(仓库,物品)合起来组成的,它们之间任何一个和数量都不能部分函数依赖。因此这个表是满子第三范式的,但是它还是存在下面的问题:

    • 删除问题:对于最后一条记录,(北京仓,李四,iPad Mini,60),我们以后再也不会往这个仓库中存iPad Mini 了,那删除的时候只能连同仓库一起删除。
    • 插入问题:如果新建仓库,尚未存入物品,那么也不能为仓库分配管理员。
    • 修改异常:如果某个仓库更换了管理员,修改的时候需要逐条记录一起修改。

    既然都满足第三范式了,那为什么还是会出现这么多的问题呢?因为存在主属性对主属性的部分函数依赖,此例子中存在(管理员,物品名)->仓库,但是实际上管理员->仓库。因此就存在了主属性对主属性(码)的部分函数依赖。

    我们将其模式分解: 
    仓库(仓库名,管理员) 
    库存(仓库名,物品名,数量)

    再次回头看与原来的问题有没有得到解决

    • 删除问题:因为仓库现在有专门的表,所以删除物品的时候不会影响仓库。问题得到改善。
    • 插入问题:现在直接再仓库表中新建仓库,与管理员没有关系。得到改善。
    • 修改异常:修改了某个仓库的管理员,直接修改仓库表就可以了。得到改善。

    符合BCNF的数据库已经非常严格了。但是这种严格只是在函数依赖层面的。啥?上升层面?不是吧,对!接下来要说的第四范式研究的领域是多值依赖层面的。

    8. 第四范式(4NF)

    那我们还是开门见山的来看一个例子:

    Teaching(C,T,B),C表示课程,T表示老师,B表示参考书。 
    有下面未规范化的关系: 
    这里写图片描述

    我们先让它满足1NF如下所示: 
    这里写图片描述

    发现存在许多问题:

    • 信息冗余:课程和教师存在大量的数据冗余。
    • 插入问题:当某个课程增加了一个任课老师,那么需要插入多个元组。
    • 删除问题:如果删除一本书,需要删除很多条记录,非常麻烦。

    我们再来看它到底属于第几范式。发现这个关系中C、T、B都是唯一的,也就是全键。不存在非主属性,也不存在主属性对主属性的的部分函数依赖和传递函数依赖(因为那样码中至少要两个主属性),它只有一个码(C、T、B)。也就是这个关系是属于BCNF的。那它又为什么会出现这么多问题呢?就是因为它存在多值依赖。

    多值依赖:在关系模式R(U)中,X、Y、Z是U的子集,Z=U-X-Y。如果多值依赖X->->Z成立,那么给定(x,y),能确定z的一组值,而且这个值仅由x决定,与y没有关系。

    比如:在Teaching中,C、B、T是Teaching的子集,T=Teaching-C-B。给定(C,B),比如(数据库原理与应用,SQL Server 2000),能确定一组T值(邓宇,孙泽)。但是这组T值只与C(数据库原理与应用)有关,与B(SQL Server 2000)没有关系,我们就说C->->T。叫做T多值依赖于C。

    平凡多值依赖:如果y为空集。X->->Z就是平凡多值依赖 
    非平凡多值依赖:y不为空。

    其实已经分析完了,就是因为Teaching关系中存在多值依赖,所以才会由我们说的问题,我们进行模式分解,分解得到的表如下所示:

    TC表(课程,教师) 
    BC表(课程,参考书)

    看看我们的问题有没有得到解决:

    • 信息冗余:得到改善。
    • 插入问题:某个课程增加老师,只要在TC表中添加一条记录就好了。改善
    • 删除问题:删除一本书,也只要在BC表中删除一条记录即可。改善

    现在的表是满足第四范式的,说了这么多,我们最后给出第四范式的定义:关系模式R满足1NF的前提下,如果R中每一个非平凡多值依赖X->->Y,X中都含有键,则R属于4NF,前面讨论的关系中。键是(T、C、B),是全键。C->->B,C->->T,这种多值依赖是非平凡的,但是单独的C不是键,所以就无法满足第四范式。

    总结 :函数依赖和多值依赖是两种重要的数据依赖。如果只考虑函数依赖,BCNF已经是非常高的级别了,而且再往上考虑除了多值依赖还有连接依赖,连接依赖属于5NF的范畴了。通过本文中的三个不同例子也能看出来,数据库优化针对不同的数据库到达相应的级别就好,简单的数据库到达第三范式就已经非常完美了。而且增加范式就意味着分解,分解意味着以后可能会连接查询,那样又会影响效率。最后给出著名的数据库优化十六字经:由低到高,逐步规范,权衡利弊,适可而止这里写图片描述

    如果认真的看到这里,我想你一定有所收获,那么赞一个吧。

    转载于https://blog.csdn.net/yangbodong22011/article/details/51619590
    展开全文
  • 原文链接:https://www.jianshu.com/p/3e97c2a1687b 数据库设计三范式 ...第三范式:所有非主键字段和主键字段之间不能产生传递依赖 第一范式 数据库表中不能出现重复记录,每个字段是原子性...
  • 基于SQLITE数据库的C语言编程

    千次阅读 2012-09-03 09:35:28
    原文地址:http://www.cnblogs.com/elect-fans/archive/2012/08/04/2622471.html ...通过使用这些接口,传递一些标准 sql 语句(以 char * 类型)给 sqlite 函数, sqlite 就会为你操作数据库。 s
  • 数据库连接池DBCP

    2010-12-05 11:23:06
    dbcp配置中文版本,翻译自apache 官方文档,原文请见http://commons.apache.org/dbcp/configuration.html。 参数 描述 username 传递给JDBC驱动的用于建立连接的用户名 password 传递给JDBC驱动的用于建立...
  • 原文:http://www.entityframeworktutorial.net/code-first/database-initialization-in-code-first.aspx ...下图显示了一个数据库初始化工作流程,基于从DbContext派生的上下文类的基础构造函数中传递的参数: ...
  • $Date: 2013-12-16 13:34:20 +0800 (Thu, 16 May 2013) $摘要你是否想过当数据库中的数据发生变化的时候出发某种操作?但因数据无法与其他进程通信(传递信号)让你放弃,而改用每隔一段时间查询一次数据变化的方法...
  • Unity3D 使用C#语言建立本地数据库

    千次阅读 2012-12-03 16:54:20
    原创文章如需转载请注明:转载自雨松MOMO程序研究院本文链接地址:Unity3D研究院之使用C#语言建立本地数据库(二十三) 原文:...以前在开发中一直使用IOS源生的数据库,通过传递消息
  • 免费获取原文途径

    2013-06-12 06:47:56
    一、全文电子期刊数据库(学校购买) 二、全国期刊联合目录数据库 三、国家科技图书文献中心 四、网上免费资源(GOOGLE,DOAJ) 六、北京地区高校图书馆文献资源保障体系(BALIS) ...八、原文传递
  • JDBC数据库连接池配置

    2011-11-29 10:28:05
    dbcp配置中文版本,翻译自apache 官方文档,原文请见http://commons.apache.org/dbcp/configuration.html。 参数 描述 username 传递给JDBC驱动的用于建立连接的用户名 password 传递给JDBC驱动的用于建立...
  • 1NF 属性不可分割 2NF 没有部分依赖 3NF 没有传递依赖 反规范化设计 反规范化设计的前提反规范化设计是规范化设计之后的步骤,首先令所有关系满足规范化设计(一般到3NF),之后的反规范化设计才能是可控的。 反...
  • 读淘宝数据库架构之体会

    千次阅读 2012-09-04 14:38:02
    在执行查询时,如遇代理对象,对数据的远程传递和缓存都会产生影响(代理对象无法序列化,代理方法执行时找不到session)。打散库表关系后,对数据库的访问主要通过主键ID来完成,其他查询方法可通过倒排索引库来操作。...
  • 这个类不是我实现的,英文原文地址为http://www.eggheadcafe.com/articles/20050315.asp,这里修改了原文中分析sql语句参数的方法,将方法名修改为AttachParameters,将其修饰符修改为private,并直接传递command到...
  • 原文:http://blog.51cto.com/kaigejava/2084552应用场景:1:在使用mysql数据库进行存储数据的时候,有时候,一个字段,要存储使用逗号分隔的多个数据,在查询的时候,传递的是一个keyword,需要在逗号分隔的字段中...
  • 原文链接 第1章 数据库概论 一、数据库理论基础 1.数据存储方式 人工管理阶段 文件系统阶段 数据库系统阶段   2.数据库泛型 1NF:每一个分量必须是不可分割数据项 2NF:消除非主...
  • 原文链接 第1章 数据库概论 一、数据库理论基础 1.数据存储方式 人工管理阶段 文件系统阶段 数据库系统阶段 2.数据库泛型 1NF:每一个分量必须是不可分割数据项 2NF:消除非主属性对码的部分函数依赖 ...
  • 原文:http://forum.unity3d.com/threads/28500-SQLite-Class-Easier-Database-Stuff原始文章主要是使用JavaScript语言建立本地数据库以前在开发中一直使用IOS源生的数据库,通过传递消息的形式在与Unity3D中进行...
  • Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将...
  • 这个类不是我实现的,原文在这里,我修改了原文中分析sql语句参数的方法,将方法名修改为AttachParameters,将其修饰符修改为private,并直接传递command到这个方法,直接绑定参数到comand。修改后的代码如下 using...
  • 本文分享自华为云社区《华为云PB级数据库GaussDB(for Redis)揭秘第五期:高斯 Redis 在IM场景中的应用》,原文作者:心机胖 。 一、背景 即时通讯(Instant Messaging,简称IM)是一个实时通信系统,允许两人或...
  • 原文出处:https://blog.csdn.net/jaryle/article/details/51228751使用jdbc开发时,和mybatis相比的不足1,数据库连接,使用时就创建,不使用就释放,对数据库进行频繁连接开关和关闭,造成数据库资源浪费,影响...

空空如也

空空如也

1 2 3 4 5 6
收藏数 106
精华内容 42
关键字:

原文传递数据库