我的最新日志

  • log4j快速入门实践功略(1)

    2006-7-03

       

    log4j快速入门实践功略(1)




    #log4j.rootLogger = [ level ] , appenderName, appenderName,
    #优先级level 为 OFF、FATAL、ERROR、WARN、INFO、DEBUG、log、ALL或自定义的优先级
    #Log4j常用的优先级FATAL>ERROR>WARN>INFO>DEBUG

    #stdout为控制台 ,Errorlog为错误记录日志 ,
    log4j.rootCategory=INFO,stdout,Runlog,Errorlog


    #输出的appender的格式为
    #log4j.appender.appenderName = fully.qualified.name.of.appender.class
    #log4j.appender.appenderName.option1 = value1
    #log4j.appender.appenderName.option = valueN
    #Log4j中appender支持的输出
    #org.apache.log4j.ConsoleAppender 控制台
    #org.apache.log4j.FileAppender 文件
    #org.apache.log4j.DailyRollingFileAppender 每天产生一个日志文件
    #org.apache.log4j.RollingFileAppender (文件大小到达指定尺寸的时候产生一个新的文件),
    #org.apache.log4j.WriterAppender (将日志信息以流格式发送到任意指定的地方)
    #org.apache.log4j.net.SMTPAppender 邮件
    #org.apache.log4j.jdbc.JDBCAppender 数据库

    #定义输出的形式
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.Runlog=org.apache.log4j.DailyRollingFileAppender
    log4j.appender.Errorlog=org.apache.log4j.DailyRollingFileAppender


    #可以指定输出文件的优先级
    log4j.appender.Errorlog.Threshold=ERROR

    #指定输出的文件
    log4j.appender.Runlog.File=D:\UserInfoSyn\WebRoot\WEB-INF\runlog\runlog.log
    log4j.appender.Errorlog.File=D:\UserInfoSyn\WebRoot\WEB-INF\errorlog\errorlog.log


    #Log4j的layout布局
    #org.apache.log4j.HTMLLayout 以HTML表格形式布局
    #org.apache.log4j.PatternLayout 可以灵活地指定布局模式
    #org.apache.log4j.SimpleLayout 包含日志信息的级别和信息字符串
    #org.apache.log4j.TTCCLayout   包含日志产生的时间、线程、类别等等信息

    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.Runlog.layout=org.apache.log4j.PatternLayout
    log4j.appender.Errorlog.layout=org.apache.log4j.PatternLayout

    #输出格式,log4j javadoc org.apache.log4j.PatternLayout
    #-X号:X信息输出时左对齐;
    #%p:日志信息级别
    # %d{}:日志信息产生时间
    # %c:日志信息所在地(类名)
    # %m:产生的日志具体信息
    # %n:%n:输出日志信息换行
    log4j.appender.stdout.layout.ConversionPattern= %5p %d{yyyy-MM-dd HH:mm:ss} %c %m %n
    log4j.appender.Runlog.layout.ConversionPattern= %5p %d{yyyy-MM-dd HH:mm:ss} %c %m %n
    log4j.appender.Errorlog.layout.ConversionPattern= %5p %d{yyyy-MM-dd HH:mm:ss} %c %m %n

    #指定某个包的优先级
    #
    log4j.category.com.neusoft.mbip.dm.util=ERROR


    #示例
    ###################
    # Console Appender
    ###################
    #log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
    #log4j.appender.Threshold=DEBUG
    #log4j.appender.CONSOLE.Target=System.out
    #log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
    #log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
    #log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n


    #####################
    # File Appender
    #####################
    #log4j.appender.FILE=org.apache.log4j.FileAppender
    #log4j.appender.FILE.File=file.log
    #log4j.appender.FILE.Append=false
    #log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
    #log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
    # Use this layout for LogFactor 5 analysis

    ########################
    # Rolling File????? RollingFileAppender??????????????????
    ########################
    #log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
    #log4j.appender.ROLLING_FILE.Threshold=ERROR
    # 文件位置
    #log4j.appender.ROLLING_FILE.File=rolling.log
    #log4j.appender.ROLLING_FILE.Append=true
    #文件大小
    #log4j.appender.ROLLING_FILE.MaxFileSize=10KB
    #指定采用输出布局和输出格式
    #log4j.appender.ROLLING_FILE.MaxBackupIndex=1
    #log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
    #log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

    ####################
    # Socket Appender
    ####################
    #log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender
    #log4j.appender.SOCKET.RemoteHost=localhost
    #log4j.appender.SOCKET.Port=5001
    #log4j.appender.SOCKET.LocationInfo=true
    # Set up for Log Facter 5
    #log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout
    #log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n

    ########################
    # SMTP Appender
    #######################
    #log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
    #log4j.appender.MAIL.Threshold=FATAL
    #log4j.appender.MAIL.BufferSize=10
    #log4j.appender.MAIL.From=chenyl@hollycrm.com
    #log4j.appender.MAIL.SMTPHost=mail.hollycrm.com
    #log4j.appender.MAIL.Subject=Log4J Message
    #log4j.appender.MAIL.To=chenyl@hollycrm.com
    #log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
    #log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

    ########################
    # JDBC Appender
    #######################
    #log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
    #log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
    #log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
    #log4j.appender.DATABASE.user=root
    #log4j.appender.DATABASE.password=
    #log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')
    #log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
    #log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

    ########################
    # Log Factor 5 Appender
    ########################
    #log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
    #log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000

    ###################
    #???Appender
    ###################
    #log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender
    #log4j.appender.im.host = mail.cybercorlin.net
    #log4j.appender.im.username = username
    #log4j.appender.im.password = password
    #log4j.appender.im.recipient = corlin@cybercorlin.net
    #log4j.appender.im.layout=org.apache.log4j.PatternLayout
    #log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

  • 使用MiddleGen 产生hibernate的数据库表映射文件

    2006-6-29

    1:下载Middlegen-Hibernate-r5
    地址:URL
    2:解压缩
    将下载的解压缩,如 D:Middlegen-Hibernate-r5
    3:配置数据库文件
    进入D:Middlegen-Hibernate-r5 目录下的configdatabase 子目录,选择你要得数据库文件,我使用的是mysql.
    将原来的
    <property name="database.driver.file"     value="${lib.dir}/mysql-connector-java-3.0.0-beta-bin.jar"/>
    改成
    <property name="database.driver.file"     value="${lib.dir}/mysql-connector-java-3.0.15-ga-bin.jar"/>
    同时指定数据库与用户名。我的配置如下(红色部分是要修改的部分)
    <property name="database.script.file"     value="${src.dir}/sql/${name}-mysql.sql"/>
    <!--property name="database.driver.file"     value="${lib.dir}/mysql-connector-java-3.0.0-beta-bin.jar"/-->
    <property name="database.driver.file"     value="${lib.dir}/mysql-connector-java-3.0.15-ga-bin.jar"/>
    <property name="database.driver.classpath"   value="${database.driver.file}"/>
    <property name="database.driver"       value="org.gjt.mm.mysql.Driver"/>
    <property name="database.url"       value="jdbc:mysql://localhost/hibernate"/>
    <property name="database.userid"       value="root"/>
    <property name="database.password"     value=""/>
    <property name="database.schema"       value=""/>
    <property name="database.catalog"     value=""/>
    <property name="jboss.datasource.mapping"   value="mySQL"/>

    将mysql的驱动程序mysql-connector-java-3.0.15-ga-bin.jar copy 到D:Middlegen-Hibernate-r5lib下

    4:修改Build.xml
    修改D:Middlegen-Hibernate-r5目录下的build.xml 文件,此文件是Middlegen-Hibernate 的Ant
    构建配置。Middlegen-Hibernate将根据build.xml 文件中的具体参数生成数据库表映射
    文件

    1)第24行 修改数据库连接
    将hsqldb.xml 改成mysql.xml
    <!ENTITY database SYSTEM "file:./config/database/mysql.xml">
    2)第52行 修改输出目录
    将${build.dir}/gen-src 改成你要的目录
    <property name="build.gen-src.dir"     value="D:/Middlegen-Hibernate-r5/sample"/>
    3)第184行 对应代码的Package name
    hibernate 节点package 属性的默认设置实际上是由前面的
    Application Name (${name})和“.hibernate”组合而成,根据我们的需要,
    将其改为
      <hibernate
        destination="${build.gen-src.dir}"
        package="org.hibernate.sample"
        genXDocletTags="true"
        genIntergratedCompositeKeys="false"
        javaTypeMapper="middlegen.plugins.hibernate.HibernateJavaTypeMapper"
      />
    这里还有一个属性genXDocletTags,如果设置为true,则生成的代码将包含
    xdoclet tag。
    4)第33行 修改应用名
    将原来的
    <property name="name" value="airline"/>
    改成
    <property name="name" value="HibernateSample"/>

    5:切换到D:Middlegen-Hibernate-r5目录,运行ant
  • 程序员每天该做的事

    2006-6-21

    程序员每天该做的事
    1、总结自己一天任务的完成情况
    最好的方式是写工作日志,把自己今天完成了什么事情,遇见了什么问题都记录下来,日后翻看好处多多

    2、考虑自己明天应该做的主要工作
    把明天要做的事情列出来,并按照优先级排列,第二天应该把自己效率最高的时间分配给最重要的工作

    3、考虑自己一天工作中失误的地方,并想出避免下一次再犯的方法
    出错不要紧,最重要的是不要重复犯相同的错误,那是愚蠢

    4、考虑自己一天工作完成的质量和效率能否还能提高
    一天只提高1%,365天你的效率就能提高多少倍你知道吗? (1+0.01)^365 = 37 倍

    5、看一个有用的新闻网站或读一张有用的报纸,了解业界动态
    闭门造车是不行的,了解一下别人都在做什么,对自己能带来很多启示

    6、记住一位同事的名字及其特点
    你认识公司的所有同事吗?你了解他们吗?

    7、清理自己的代码
    今天完成的代码,把中间的调试信息,测试代码清理掉,按照编码风格整理好,注释都写好了吗?

    8、清理自己的桌面
    当日事当日毕,保持清洁干劲的桌面才能让你工作时不分心,程序员特别要把电脑的桌面清理干净

    程序员每周该做的事
    1、向你的老板汇报一次工作
    让你的老板知道你在做什么,这很重要。可以口头、书面、邮件,看你老板的工作方式而定

    2、进行一次自我总结(非正式)
    这周之内自己表现得怎么样?该加分还是扣分?

    3、制定下周计划
    把下周要做的事情列出来,一样要分清楚优先级

    4、整理自己的文件夹、书柜和电脑文件
    把桌面以外的地方也要清理干净,电脑的文件夹,收到的邮件,把过时的垃圾全部清理掉

    5、与一个非公司的朋友沟通
    它山之石,可以攻玉

    6、看一本杂志
    找一本适合自己的专业杂志

    7、纠正自己或同事一个细节上的不正确做法
    《细节决定成败》看过了吗?没看过强烈建议先看看

    程序员每月该做的事
    1、至少和一个同事一起吃饭或喝茶
    不光了解自己工作伙伴的工作,还要了解他们的生活

    2、自我考核一次
    相对正式地考核自己一下,你对得起这个月的工资吗?

    3、对你的同事考核一次
    你的同事表现怎么样?哪些人值得学习,哪些人需要帮助?

    4、制定下月的计划,确定下月的工作重点

    5、总结自己工作质量改进状况
    自己的质量提高了多少?

    6、有针对性地对一项工作指标做深入地分析并得出改进的方案
    可以是对自己的,也可以是对公司的,一定要深入地分析后拿出自己的观点来。要想在老板面前说得上话,做的成事,工作上功夫要做足。

    7、与老板沟通一次
    最好是面对面地沟通,好好表现一下自己,虚心听取老板的意见,更重要的是要了解老板当前关心的重点

    程序员每年该做的事
    1、年终总结
    每个公司都会做的事情,但你真正认真地总结过自己吗?

    2、兑现给自己、给家人的承诺
    给老婆、儿子的新年礼物买了没有?给自己的呢?

    3、下年度工作规划
    好好想想自己明年的发展目标,争取升职/加薪、跳槽还是自己出来干?

    4、掌握一项新技术
    至少是一项,作为程序员一年要是一项新技术都学不到手,那就一定会被淘汰。
    掌握可不是看本书就行的,要真正懂得应用,最好你能够写一篇教程发表到你的blog

    5、推出一种新产品
    可以是一个真正的产品,也可以只是一个类库,只要是你创造的东西就行,让别人使用它,也为世界作点贡献。当然如果真的很有价值,收点注册费也是应该的

    6、与父母团聚一次
    常回家看看,常回家看看

    希望我能做到哦
  • 关系数据库设计之基本规则--范式

    2006-6-20

    构造数据库必须遵循一定的规则。在关系数据库中,这种规则就是范式。范式是符合某一种级别的关系模式的集合。关系数据库中的关系必须满足一定的要求,即满足不同的范式。目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)和第六范式(6NF)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了。下面我们举例介绍第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。

    3.4.1 第一范式(1NF)
      在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。
      所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。例如,对于图3-2 中的员工信息表,不能将员工信息都放在一列中显示,也不能将其中的两列或多列在一列中显示;员工信息表的每一行只表示一个员工的信息,一个员工的信息在表中只出现一次。简而言之,第一范式就是无重复的列。

    3.4.2 第二范式(2NF)
      第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。如
    图3-2 员工信息表中加上了员工编号(emp_id)列,因为每个员工的员工编号是惟一的,因此每个员工可以被惟一区分。这个惟一属性列被称为主关键字或主键、主码。
      第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。简而言之,第二范式就是非主属性非部分依赖于主关键字。

    3.4.3 第三范式(3NF)
      满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在图3-2
    的员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性。



















    关系数据库设计之时是要遵守一定的规则的。尤其是数据库设计范式 现简单介绍1NF(第一范式),2NF(第二范式),3NF(第三范式)和BCNF,另有第四范式和第五范式留到以后再介绍。 在你设计数据库之时,若能符合这几个范式,你就是数据库设计的高手。
    第一范式(1NF):在关系模式R中的每一个具体关系r中,如果每个属性值 都是不可再分的最小数据单位,则称R是第一范式的关系。例:如职工号,姓名,电话号码组成一个表(一个人可能有一个办公室电话 和一个家里电话号码) 规范成为1NF有三种方法:
    一是重复存储职工号和姓名。这样,关键字只能是电话号码。
    二是职工号为关键字,电话号码分为单位电话和住宅电话两个属性
    三是职工号为关键字,但强制每条记录只能有一个电话号码。
    以上三个方法,第一种方法最不可取,按实际情况选取后两种情况。
    第二范式(2NF):如果关系模式R(U,F)中的所有非主属性都完全依赖于任意一个候选关键字,则称关系R 是属于第二范式的。
    例:选课关系 SCI(SNO,CNO,GRADE,CREDIT)其中SNO为学号, CNO为课程号,GRADEGE 为成绩,CREDIT 为学分。 由以上条件,关键字为组合关键字(SNO,CNO)
    在应用中使用以上关系模式有以下问题:
    a.数据冗余,假设同一门课由40个学生选修,学分就 重复40次。
    b.更新异常,若调整了某课程的学分,相应的元组CREDIT值都要更新,有可能会出现同一门课学分不同。
    c.插入异常,如计划开新课,由于没人选修,没有学号关键字,只能等有人选修才能把课程和学分存入。
    d.删除异常,若学生已经结业,从当前数据库删除选修记录。某些门课程新生尚未选修,则此门课程及学分记录无法保存。
    原因:非关键字属性CREDIT仅函数依赖于CNO,也就是CREDIT部分依赖组合关键字(SNO,CNO)而不是完全依赖。
    解决方法:分成两个关系模式 SC1(SNO,CNO,GRADE),C2(CNO,CREDIT)。新关系包括两个关系模式,它们之间通过SC1中的外关键字CNO相联系,需要时再进行自然联接,恢复了原来的关系
    第三范式(3NF):如果关系模式R(U,F)中的所有非主属性对任何候选关键字都不存在传递信赖,则称关系R是属于第三范式的。
    例:如S1(SNO,SNAME,DNO,DNAME,LOCATION) 各属性分别代表学号,
    姓名,所在系,系名称,系地址。
    关键字SNO决定各个属性。由于是单个关键字,没有部分依赖的问题,肯定是2NF。但这关系肯定有大量的冗余,有关学生所在的几个属性DNO,DNAME,LOCATION将重复存储,插入,删除和修改时也将产生类似以上例的情况。
    原因:关系中存在传递依赖造成的。即SNO -> DNO。 而DNO -> SNO却不存在,DNO -> LOCATION, 因此关键辽 SNO 对 LOCATION 函数决定是通过传递依赖 SNO -> LOCATION 实现的。也就是说,SNO不直接决定非主属性LOCATION。
    解决目地:每个关系模式中不能留有传递依赖。
    解决方法:分为两个关系 S(SNO,SNAME,DNO),D(DNO,DNAME,LOCATION)
    注意:关系S中不能没有外关键字DNO。否则两个关系之间失去联系。
    BCNF:如果关系模式R(U,F)的所有属性(包括主属性和非主属性)都不传递依赖于R的任何候选关键字,那么称关系R是属于BCNF的。或是关系模式R,如果每个决定因素都包含关键字(而不是被关键字所包含),则RCNF的关系模式。
    例:配件管理关系模式 WPE(WNO,PNO,ENO,QNT)分别表仓库号,配件号,职工号,数量。有以下条件
    a.一个仓库有多个职工。
    b.一个职工仅在一个仓库工作。
    c.每个仓库里一种型号的配件由专人负责,但一个人可以管理几种配件。
    d.同一种型号的配件可以分放在几个仓库中。
    分析:由以上得 PNO 不能确定QNT,由组合属性(WNO,PNO)来决定,存在函数依赖(WNO,PNO) -> ENO。由于每个仓库里的一种配件由专人负责,而一个人可以管理几种配件,所以有组合属性(WNO,PNO)才能确定负责人,有(WNO,PNO)- > ENO。因为 一个职工仅在一个仓库工作,有ENO -> WNO。由于每个仓库里的一种配件由专人负责,而一个职工仅在一个仓库工作,有 (ENO,PNO)-> QNT。
    找一下候选关键字,因为(WNO,PNO) -> QNT,(WNO,PNO)-> ENO ,因此(WNO,PNO)可以决定整个元组,是一个候选关键字。根据ENO->WNO,(ENO,PNO)->QNT,故(ENO,PNO)也能决定整个元组,为另一个候选关键字。属性ENO,WNO,PNO 均为主属性,只有一个非主属性QNT。它对任何一个候选关键字都是完全函数依赖的,并且是直接依赖,所以该关系模式是3NF。
    分析一下主属性。因为ENO->WNO,主属性ENO是WNO的决定因素,但是它本身不是关键字,只是组合关键字的一部分。这就造成主属性WNO对另外一个候选关键字(ENO,PNO)的部 分依赖,因为(ENO,PNO)-> ENO但反过来不成立,而P->WNO,故(ENO,PNO)-> WNO 也是传递依赖。
    虽然没有非主属性对候选关键辽的传递依赖,但存在主属性对候选关键字的传递依赖,同样也会带来麻烦。如一个新职工分配到仓库工作,但暂时处于实习阶段,没有独立负责对某些配件的管理任务。由于缺少关键字的一部分PNO而无法插入到该关系中去。又如某个人改成不管配件了去负责安全,则在删除配件的同时该职工也会被删除。
    解决办法:分成管理EP(ENO,PNO,QNT),关键字是(ENO,PNO)工作EW(ENO,WNO)其关键字是ENO
    缺点:分解后函数依赖的保持性较差。如此例中,由于分解,函数依赖(WNO,PNO)-> ENO 丢失了, 因而对原来的语义有所破坏。没有体现出每个仓库里一种部件由专人负责。有可能出现一部件由两个人或两个以上的人来同时管理。因此,分解之后的关系模式降低了部分完整性约束。
    一个关系分解成多个关系,要使得分解有意义,起码的要求是分解后不丢失原来的信息。这些信息不仅包括数据本身,而且包括由函数依赖所表示的数据之间的相互制约。进行分解的目标是达到更高一级的规范化程度,但是分解的同时必须考虑两个问题:无损联接性和保持函数依赖。有时往往不可能做到既有无损联接性,又完全保持函数依赖。需要根据需要进行权衡。
    1NF直到BCNF的四种范式之间有如下关系:
    BCNF包含了3NF包含2NF包含1NF
    小结:
    目地:规范化目的是使结构更合理,消除存储异常,使数据冗余尽量小,便于插入、删除和更新
    原则:遵从概念单一化 "一事一地"原则,即一个关系模式描述一个实体或实体间的一种联系。规范的实质就是概念的单一化。
    方法:将关系模式投影分解成两个或两个以上的关系模式。
    要求:分解后的关系模式集合应当与原关系模式"等价",即经过自然联接可以恢复原关系而不丢失信息,并保持属性间合理的联系。
    注意:一个关系模式结这分解可以得到不同关系模式集合,也就是说分解方法不是唯一的。最小冗余的要求必须以分解后的数据库能够表达原来数据库所有信息为前提来实现。其根本目标是节省存储空间,避免数据不一致性,提高对关系的操作效率,同时满足应用需求。实际上,并不一定要求全部模式都达到BCNF不可。有时故意保留部分冗余可能更方便数据查询。尤其对于那些更新频度不高,查询频度极高的数据库系统更是如此。
    在关系数据库中,除了函数依赖之外还有多值依赖,联接依赖的问题,从而提出了第四范式,第五范式等更高一级的规范化要求。在此,以后再谈。
    各位朋友,你看过后有何感想,其实,任何一本数据库基础理论的书都会讲这些东西,考虑到很多网友是半途出家,来做数据库。特找一本书大抄特抄一把,各位有什么问题,也别问我了,自已去找一本关系数据库理论的书去看吧,说不定,对各位大有帮助。说是说以上是基础理论的东西,请大家想想,你在做数据库设计的时候有没有考虑过遵过以上几个范式呢,有没有在数据库设计做得不好之时,想一想,对比以上所讲,到底是违反了第几个范式呢?
    我见过的数据库设计,很少有人做到很符合以上几个范式的,一般说来,第一范式大家都可以遵守,完全遵守第二第三范式的人很少了,遵守的人一定就是设计数据库的高手了,BCNF的范式出现机会较少,而且会破坏完整性,你可以在做设计之时不考虑它,当然在ORACLE中可通过触发器解决其缺点。以后我们共同做设计之时,也希望大家遵守以上几个范式。
  • 终于入手dopod575

    2006-6-19

    终于入手dopod575,兴奋中
  • E都市应用

    2006-6-18

    http://my.edushi.com/note/url.aspx?id=10095

    http://www.edushi.com/api/api_s.htm

    三维地图,大家可以试试看,页可以在自己主页上加入地址的


    <iframe scrolling="no" marginheight="0" marginwidth="0" width="500" height="400" src="http://my.edushi.com/blog/previe ... 9%u91CC%u4E0A%u73ED"></iframe>
  • confluence配置指南

    2006-6-15

    下载最新版本,解压。
    修改文件 WEB-INFclasses÷confluence-init.properties

    加上 confluence.home=c:/confluence/data
    数据存放目录

    执行build.bat或是 build.sh文件
    生成war包。拷贝到webapps下即可
    重启tomcat。访问
  • jira安装指南

    2006-6-15

    jira配置文件


    下载war包

    http://www.atlassian.com/software/jira/JIRADownloadCenter.jspa(需要注册用户才可以下载)

    3.6.2 Enterprise EAR/WAR 23 MB      24-May-06       ZIP         TAR.GZ(y有23M大小)

    下载完毕后,解压。
    进入webappWEB-INFclasses
    修改文件entityengine.xml

    <transaction-factory class="org.ofbiz.core.entity.transaction.JNDIFactory">
        <user-transaction-jndi jndi-server-name="default" jndi-name="java:comp/env/UserTransaction"/>
        <transaction-manager-jndi jndi-server-name="default" jndi-name="java:comp/env/UserTransaction"/>
      </transaction-factory>

    加上env路径

    <datasource name="defaultDS" field-type-name="mysql"
        helper-class="org.ofbiz.core.entity.GenericHelperDAO"

    修改为你自己想要的数据库


    执行build.bat或是build.sh
    生成war包


    拷贝文件

    下载mysql-connector-java-3.1.12-bin.jar拷贝到Tomcat安装目录的commonlib下,请特别注意版本号必须为3.1.12

    下载jira-tomcat
    根据自己的tomcat版本下载相应的文件包
    jira-jars-tomcat.zip
    解压到Tomcat's common/lib/ 目录覆盖


    拷贝 dist-tomcat/tomcat-4/jira.xml到 Tomcat's webapps/ 目录
    #

    修改jira.xml as follows:



    <Context path="/jira" docBase="path/to/atlassian-jira-3.6.2.war" debug="0">
    <Logger className="org.apache.catalina.logger.FileLogger"
          prefix="atlassian-jira." suffix=".log" timestamp="true"/>
    <Resource name="jdbc/JiraDS" auth="Container" type="javax.sql.DataSource"/>
    <ResourceParams name="jdbc/JiraDS">
      <parameter>
        <name>driverClassName</name>
        <value>org.hsqldb.jdbcDriver</value>
      </parameter>
      <parameter>
        <name>url</name>
        <value>jdbc:hsqldb:path/to/jira_database</value>
      </parameter>
      <parameter>
        <name>username</name>
        <value>sa</value>
      </parameter>
      <parameter>
        <name>password</name>
        <value></value>
      </parameter>

    修改两个地方,war的位置,

    重启tomcat,http://localhost:8080/jira就可以看到jira的配置了
  • hsql数据库使用心得

    2006-6-15

    hsql:


    database.properties

    hibernate.connection.password=
    hibernate.connection.url=jdbc:hsqldb:file:E:/data/bb
    hibernate.connection.driver_class=org.hsqldb.jdbcDriver
    hibernate.connection.username=sa

    文件模式
    内存模式
    hibernate.connection.url=jdbc:hsqldb:.
    服务器
    hibernate.connection.url=jdbc:hsqldb:hsql://localhost/meeting


    java -classpath hsqldb.jar org.hsqldb.Server -database.0 bookstore -dbname.0
    bookstore

    启动服务
    默认端口 :9001
  • 大型社区设计:提高用户体验的10个细节

    2006-6-07

     最近在开发社区程序,收集和自己想了一些能提高用户体验的社区设计理念,拿出来和大家讨论讨论.
    1,大型社区导航的设计三点考虑:
      1 “随时”出现在用户手边;
      2 尽量减少对页面的占用 ;
      3 给用户良好的“位置感”;
    现在的一般的大型社区都是采用左侧可隐藏式的框架设计来实现的。
    关于位置感觉,在导航拦的体现就是 当前浏览的拦目要突出显示
    参考:http://blog.donews.com/iqst/archive/2006/05/13/867531.aspx

    2,"恢复上一次提交"功能
    http协议是无连接的,由于网络不稳定导致用户发表失败,应该提供可恢复的手段。

    3,完全可定制的可见即可得编辑器 ,分三种情况
      1,用户可自己选择自己喜欢的编辑器。比如freetextbox,....
      2,用户可定制编辑器的某些功能,比如有些用户喜欢发表图片,发表视频,但有些确喜欢
        插入代码等,应该提供可选的定制功能,以避免过多的功能影响使用的方便性能和提高
        加载速度。
      3,具备一定的智能,比如进入贴图区,贴图功能自动出现,用户进入程序设计区,自动出现插入
        代码功能,等等。

    4,可匿名回复帖子。
      有很多网站提供这个功能,也有很多网站不提供这个功能。我认为是否提供这个功能是判断
      一个社区是否体贴用户的一个标志。时刻记着,引导用户注册而非强迫用户注册。前者带来
      的注册用户对社区的认同感和粘性将更强。

    5,分页的考虑
    1,用户应该可以随时选择 每页显示20条,还是40条,或其他指定的任何分页值。这个可用于
    列表页,也可用于内容页的情况。
    2,尽量用数字表示页码,而不是上页/下页的样式。baidu,google的设计的就不错。


    6,站内短消息功能
    1,容量应该是有限度的。比如最多保存20条等。站内短消息是用来即时交流和通知信息
      不是用来存储的。以提醒用户及时处理自己的信息。同时也可清理那些N年不来一次的
      用户的短消息,以避免浪费系统资源。
    2,可导出短消息。
    3,草稿箱功能。满足两种用户需要:先写好,想想是否要发;写完了,突然不想发,但不肯定
      将来要不要发,提供保存功能。
    4,可设置不接收某些用户的信息,或者不接受所有用户的信息。

    7,贴心的搜索功能
    一般的老用户在你的社区呆久了,自然就会添加了很多好友,收藏了很多帖子。也可能发表
    了很多帖子,应该提供精确定向的搜索功能,可搜索自己的发表的或收藏的帖子,好友的发
    表的帖子的等等。这个功能大多的社区都没提供。

    8,在用户写作区(编辑器)的某个合适的地方提供搜索框
    可用google或baidu的搜索框。有些用户喜欢在线写作,偶尔需要搜索引用些资料。这样会
    给用户提供一定的方便。还有可能为网站增加收入。但要注意,以不影响用户写作为前提。
    这个功能特别适合技术类的blog。

    9,智能化的推荐帖
    有些社区在精华帖之外,还有个推荐帖的概念,不过我认为推荐帖不是由网站决定的,而应该
    根据用户以往的浏览记录,收藏记录。用户信息的爱好等信息智能判断提取用户最有可能喜欢的
    帖子做为推荐帖子,当然也可能考虑帖子的多种考虑因素,增加推荐成功率。

    10,楼主/博主的回复“突出显示”
    这个在某些时候会很有用。不过我觉得对blog特别有用。因为你阅读博主blog的文章,对博主
    的回复自然感兴趣,对论坛的意思不是特别大。

我的最新图片

Open Toolbar