精华内容
下载资源
问答
  • 这两天看了重温了下设计模式和数据结构,又补了下基础知识,然后就失眠了一整夜,不知为啥就想到级联及伪删数据这个问题。 由于级联删除是几乎人人都会遇到的问题,但方案却有限却不美好,所以欢迎大伙集思文益,...

    背景:

    这两天看了重温了下设计模式和数据结构,又补了下基础知识,然后就失眠了一整夜,不知为啥就想到级联及伪删数据这个问题。

    由于级联删除是几乎人人都会遇到的问题,但方案却有限却不美好,所以欢迎大伙集思文益,以下内容欢迎大伙一起讨论。

    级联删除的方式:

    方式1:数据库设定级联:

    常规MSSQL、MySql、Oracle都对设定了主外键关系的表提供级联删除。

    优点:数据准确、使用方便,数据库设计之初就设定好。

    缺点:

    1:增加对增删改时外键检测的额外开销。

    2:潜在危险系素大(如:删除部门或角色,发现一级联递归,整个系统的数据没了)。

    3:不方便触发其它事件。

    4:开发人员可能被屏蔽细节。

    总体描述:适合小系统、小局部、无缓存状态的情况使用。

    总体总结:很少使用。

    方式2:触发器处理。

    优点:DBA喜欢。

    缺点:程序员不喜欢,很容易蒙B。

    总体描述:适合系统负责人偏DBA爱好的场景,及业务无缓存场景。

    总体总结:内部业务系统使用多、外部系统使用少。

    方式3:业务代码控制

    优点:程序员喜欢,自由控制度大。

    缺点:程序员喜欢,自由控制度大(随着业务扩展,需要到处补代码)。

    总体描述:爱自由,爱生活,爱写代码。

    总体总结:常规方式,在所有系统使用都很广泛。

    在方式3的基础上思考:如何在架构设计统一处理,减少代码的分布?

    下面聊聊复杂度更高的伪删除问题:

    触发器删除及伪删除

    1:触发器方式

    优点:

    1:通过触发器删除,并将旧数据移到其它库或表。

    2:数据干净,表压力小。

    3:代码业务逻辑简单化。

    4:DBA喜欢。

    5:一手开发人员也喜欢。

    缺点:

    1:不好控制触发其它外部业务或事件(如在删的同时清文件等,但办法总比困难多)。

    2:整体数据库压力大(这个还得看业务情况)。

    3:级联的缓存不好控制(和写触发器的同步清楚业务还是可以控制)。

    4:二接手维护的人员不喜欢。

    总体描述:总体缺点不太明显,后期维护不便。

    总体总结:业务系统用的相对较多。

    2:伪删方式

    优点:

    1:数据只是标识状态,数据恢复容易。

    2:开发人员喜欢。

    缺点:

    1:需要在系统各表增加版本号或IsDeleted等标识。

    2:业务查询都需要增加过滤条件。

    3:需要级联更新标识符号。

    4:存在脏数据。

    5:缓存需要全面控制。

    总体描述:优点不太明显,缺点是业务代码分布复杂了。

    总体总结:总体使用并不多。

    扩展内容:

    1:昨晚无意扫到了吉日一篇文章2010写的文章,大意是:

    花一个星期增加伪删deletemark字段,改遍了所有业务代码。(评论主要偏触发器方案,及致人身攻击,6年过去了,相信那些人现在应该能淡定看问题了,地址就不贴了。)

    2:对于增加字段带来的问题,有人说用视图处理。

    3:另外看到一个有趣的场景:伪删后添加相同数据的问题。

    增加IsDeleted字段后,把原来的【唯一键+IsDeleted】建立联合主键。

    删除后:cyq 0。

    新增加:cyq 1。

    发现这时候就没法再删了,再删就两个cyq 0 冲突了,你会怎么解决

    在互联网上搜伪删除相关的内容并不多,可以预见该方案的使用并没有普及,原因可能也在于没有从架构上能统一处理的方案出现。

    思考:如何在架构设计上统一处理,减少业务代码?

    博客园的级联反应是?

    假设博客园要删除或禁用一个用户,分析需要处理多少事情?

    1:几乎系统所有表都要关联处理(文章,评论,点赞,积分,闪存,招聘,博客、知识库、收藏、新闻等....)

    PS:文件、图片(考虑到文件或图片外部站大量有引用,不处理。)

    2:若缓存需要时时失效(这几乎是导致整站式缓存瞬间失效,系统要崩了......好在园子目前缓存没有时效性要求。)

    那么问题来了:

    1:园子是全处理了,还只是局部处理呢?

    全处理:工作量有点大,代码分布有点散,随着业务增加,还得补充逻辑代码。

    不处理:到处留下的用户链接导致的404,会不会影响SEO呢?

    2:用户在博问上被采纳的内容呢?删呢?还是不删呢?

    3:园子目前是采用真删呢还是伪删呢?

     

    总结:

    1:以前都是自己静静思考完,把功能在V5框架里实现了再分享。

    2:现在,分享问题,讨论后后,再确定总体思路。

    3:你参与过的项目,现在是用什么方案呢?觉的方案有改进的空间?


    本文原创发表于博客园,作者为路过秋天,原文链接:http://www.cnblogs.com/cyq1162/p/5703060.html

    展开全文
  • 背景:这两天看了重温了下设计模式和数据结构,又补了下基础知识,然后就失眠了一整夜,不知为啥就想到级联及伪删数据这个问题。由于级联删除是几乎人人都会遇到的问题,但方案却有限却不美好,所以欢迎大伙集思文益...

    背景:

    这两天看了重温了下设计模式和数据结构,又补了下基础知识,然后就失眠了一整夜,不知为啥就想到级联及伪删数据这个问题。

    由于级联删除是几乎人人都会遇到的问题,但方案却有限却不美好,所以欢迎大伙集思文益,以下内容欢迎大伙一起讨论。

    级联删除的方式:

    方式1:数据库设定级联:

    常规MSSQL、MySql、Oracle都对设定了主外键关系的表提供级联删除。

    f8b5fed5282f85c8186311a71e0879c7.png

    优点:数据准确、使用方便,数据库设计之初就设定好。

    缺点:

    1:增加对增删改时外键检测的额外开销。

    2:潜在危险系素大(如:删除部门或角色,发现一级联递归,整个系统的数据没了)。

    3:不方便触发其它事件。

    4:开发人员可能被屏蔽细节。

    总体描述:适合小系统、小局部、无缓存状态的情况使用。

    总体总结:很少使用。

    方式2:触发器处理。

    优点:DBA喜欢。

    缺点:程序员不喜欢,很容易蒙B。

    总体描述:适合系统负责人偏DBA爱好的场景,及业务无缓存场景。

    总体总结:内部业务系统使用多、外部系统使用少。

    方式3:业务代码控制

    优点:程序员喜欢,自由控制度大。

    缺点:程序员喜欢,自由控制度大(随着业务扩展,需要到处补代码)。

    总体描述:爱自由,爱生活,爱写代码。

    总体总结:常规方式,在所有系统使用都很广泛。

    在方式3的基础上思考:如何在架构设计统一处理,减少代码的分布?

    下面聊聊复杂度更高的伪删除问题:

    触发器删除及伪删除

    1:触发器方式

    优点:

    1:通过触发器删除,并将旧数据移到其它库或表。

    2:数据干净,表压力小。

    3:代码业务逻辑简单化。

    4:DBA喜欢。

    5:一手开发人员也喜欢。

    缺点:

    1:不好控制触发其它外部业务或事件(如在删的同时清文件等,但办法总比困难多)。

    2:整体数据库压力大(这个还得看业务情况)。

    3:级联的缓存不好控制(和写触发器的同步清楚业务还是可以控制)。

    4:二接手维护的人员不喜欢。

    总体描述:总体缺点不太明显,后期维护不便。

    总体总结:业务系统用的相对较多。

    2:伪删方式

    优点:

    1:数据只是标识状态,数据恢复容易。

    2:开发人员喜欢。

    缺点:

    1:需要在系统各表增加版本号或IsDeleted等标识。

    2:业务查询都需要增加过滤条件。

    3:需要级联更新标识符号。

    4:存在脏数据。

    5:缓存需要全面控制。

    总体描述:优点不太明显,缺点是业务代码分布复杂了。

    总体总结:总体使用并不多。

    扩展内容:

    1:昨晚无意扫到了吉日一篇文章2010写的文章,大意是:

    花一个星期增加伪删deletemark字段,改遍了所有业务代码。(评论主要偏触发器方案,及致人身攻击,6年过去了,相信那些人现在应该能淡定看问题了,地址就不贴了。)

    2:对于增加字段带来的问题,有人说用视图处理。

    3:另外看到一个有趣的场景:伪删后添加相同数据的问题。

    增加IsDeleted字段后,把原来的【唯一键+IsDeleted】建立联合主键。

    删除后:cyq 0。

    新增加:cyq 1。

    发现这时候就没法再删了,再删就两个cyq 0 冲突了,你会怎么解决?

    在互联网上搜伪删除相关的内容并不多,可以预见该方案的使用并没有普及,原因可能也在于没有从架构上能统一处理的方案出现。

    思考:如何在架构设计上统一处理,减少业务代码?

    博客园的级联反应是?

    假设博客园要删除或禁用一个用户,分析需要处理多少事情?

    1:几乎系统所有表都要关联处理(文章,评论,点赞,积分,闪存,招聘,博客、知识库、收藏、新闻等....)

    PS:文件、图片(考虑到文件或图片外部站大量有引用,不处理。)

    2:若缓存需要时时失效(这几乎是导致整站式缓存瞬间失效,系统要崩了......好在园子目前缓存没有时效性要求。)

    那么问题来了:

    1:园子是全处理了,还只是局部处理呢?

    全处理:工作量有点大,代码分布有点散,随着业务增加,还得补充逻辑代码。

    不处理:到处留下的用户链接导致的404,会不会影响SEO呢?

    2:用户在博问上被采纳的内容呢?删呢?还是不删呢?

    3:园子目前是采用真删呢还是伪删呢?

    总结:

    1:以前都是自己静静思考完,把功能在V5框架里实现了再分享。

    2:现在,分享问题,讨论后后,再确定总体思路。

    3:你参与过的项目,现在是用什么方案呢?觉的方案有改进的空间?

    展开全文
  • 其他的数据库使用Oralce10g,MyEclipse8.6,tomcat6.x可. 2. 本身整个文件 16M>10M无法全部上传,所以学会抽出对自己有用的部分 MarketAction.java [code="java"] package com.action; import java...
    1.最重要的是js部分.其他的数据库使用Oralce10g,MyEclipse8.6,tomcat6.x可.
    2. 本身整个文件 16M>10M无法全部上传,所以学会抽出对自己有用的部分
    MarketAction.java

    package com.action;

    import java.util.Date;
    import java.util.List;
    import java.util.Map;
    import com.entity.Market;
    import com.biz.MarketBiz;
    import com.entity.Province;
    import com.biz.ProvinceBiz;
    import java.util.ArrayList;
    import java.io.UnsupportedEncodingException;

    import net.sf.json.JSONArray;
    import net.sf.json.JsonConfig;

    /**
    * ********************************************************
    * @ClassName: MarketAction
    * @Description: 市级表
    * @author 生成Action类
    * @date 2014-08-28 下午 09:32:26
    *******************************************************
    */
    public class MarketAction {

    private MarketBiz marketbiz;

    private Market market = new Market();

    private List<Market> marketlist = new ArrayList<Market>();

    private List<Province> provincelist = new ArrayList<Province>();

    private JSONArray jsons;

    private Integer id;

    /**
    *
    *添加表<Market>信息
    *
    **/
    public String addMarket(){
    Integer results = marketbiz.addMarket(market);
    if (results > 0 ) {
    return "successs";
    }else {
    return "error";
    }
    }

    /**
    *
    *查询表<Market>所有信息
    *
    **/
    public String getAllMarket(){
    marketlist = marketbiz.getAllMarket();
    if (marketlist.size() > 0 ) {
    return "success";
    }else {
    return "error";
    }
    }

    /**
    *
    *根据@id查询表<Market>信息
    *
    **/
    public String getMarket_id(){
    market.setProvince_id(id);
    marketlist = marketbiz.getMarket_id(market);
    if (marketlist.size() > 0 ) {
    JsonConfig config = new JsonConfig();
    config.setExcludes(new String[]{"county"});
    jsons = JSONArray.fromObject(marketlist,config);
    return "edit";
    }else {
    return "error";
    }
    }

    /**
    *
    *根据@id修改表<Market>信息
    *
    **/
    public String updaMarket_id(){
    try {

    marketbiz.updaMarket_id(market);
    } catch (Exception e) {
    // TODO: handle exception
    return "error";
    }
    return "successs";
    }

    /**
    *
    *根据@id删除表<Market>信息
    *
    **/
    public String deleMarket(){
    try {
    marketbiz.deleMarket(market);
    } catch (Exception e) {
    // TODO: handle exception
    return "error";
    }
    return "successs";
    }

    /**
    *
    *查询关联表<Province>信息
    *
    **/
    public String reAllProvince(){
    provincelist = marketbiz.reAllProvince();
    if (provincelist.size() > 0 ) {
    return "relist";
    }else {
    return "error";
    }
    }

    public Market getMarket() {
    return market;
    }
    public void setMarket(Market market) {
    this.market = market;
    }
    public List<Province> getProvincelist() {
    return provincelist;
    }
    public void setProvincelist(List<Province> provincelist) {
    this.provincelist = provincelist;
    }
    public List<Market> getMarketlist() {
    return marketlist;
    }
    public void setMarketlist(List<Market> marketlist) {
    this.marketlist = marketlist;
    }
    public void setMarketbiz(MarketBiz marketbiz) {
    this.marketbiz = marketbiz;
    }

    public JSONArray getJsons() {
    return jsons;
    }

    public void setJsons(JSONArray jsons) {
    this.jsons = jsons;
    }

    public Integer getId() {
    return id;
    }

    public void setId(Integer id) {
    this.id = id;
    }

    }



    jilian.js

    function changes(obj,selectid,url){ //当前对象,选中的id,url路径.
    var id = "#"+selectid;
    if($(obj).val() != 0){
    $.ajax({type:"post",url:url,dataType:"json",
    data:{"id":$(obj).val()},//简写:TUDD.
    success:function(data){
    $(id).html("");
    $.each(data,function(i,item){
    if(selectid == "shi"){
    $(id).append("<option value="+item.market_id+">"+item.market_name+"</option>");
    }
    if(selectid == "xian"){
    $(id).append("<option value="+item.county_id+">"+item.county_name+"</option>");
    }
    });
    if(selectid == "shi"){ // 如果下一个是市,就加上请选择市.
    $(id).attr("disabled",false);
    $(id).append("<option value='0' selected='selected'>---请选择市/区---</option>");
    $.each($("select"),function(i,item){
    if(i >= $(id).index()){
    i++;
    $("select:eq("+i+")").attr("disabled",true);//改变select不可用
    $("select:eq("+i+")").val(0);
    }
    })

    }
    if(selectid == "xian"){ //同上
    $(id).attr("disabled",false);
    $(id).append("<option value='0' selected='selected'>---请选择县/区---</option>");
    }
    }
    });
    }else if(selectid == "shi" || selectid == "xian"){ //如果当前选择项是 请选择,那么下个就也是请选择,
    //且不可用-
    $.each($("select"),function(i,item){
    if(i >= $(id).index()){
    $(item).attr("disabled",true);
    $(item).val(0);
    }
    })
    }
    }

    页面部分:list.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    <%@ taglib uri="/struts-tags" prefix="s"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>


    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <base href="<%=basePath%>">

    <title>县级表总览</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

    </head>

    <body>
    <table align="center" border="1">
    <caption style="color:red;"><a href="index.jsp">Url控制</a></caption>
    <tr align="center">
    <td>市级id(外键)</td>
    <td>县级id</td>
    <td>县级名称</td>
    <td>操作</td>
    </tr>
    <s:iterator value="countylist" status="s" var="li">
    <tr align="center" <s:if test="%{#s.index % 2 == 0}">style="background-color:red;"</s:if>>
    <td><s:property value="%{#li.market_id.market_id}"/></td>
    <td><s:property value="%{#li.county_id}"/></td>
    <td><s:property value="%{#li.county_name}"/></td>
    <td>
    <a href="countyreAllMarket.action">添加</a>
    <a href="countygetCounty_id.action?county.county_id=<s:property value="%{#li.county_id}"/>">修改</a>
    <a href="javascript:confirmdel(<s:property value="%{#li.county_id}"/>)">删除</a>
    </td>
    </tr>
    </s:iterator>
    </table>

    <script type="text/javascript" src="js/jquery.min.js"></script>
    <script type="text/javascript">
    function confirmdel(id){
    if(confirm("确定要删除么")){
    location.href="countydeleCounty.action?county.county_id="+id;
    }
    }
    </script>
    </body>
    </html>

    struts-contor.xml

    <?xml version="1.0" encoding="GBK" ?>
    <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
    <struts>
    <constant name="struts.devMode" value="false"/>
    <constant name="struts.i18n.encoding" value="GBK"></constant>
    <constant name="struts.ui.theme" value="simple"></constant>
    <constant name="struts.enable.DymicMethodInvocation" value="false"/>
    <package name="default" namespace="/" extends="json-default">

    <!-- 表<Market> <MarketAction> 配置 -->
    <action name="market*" class="MarketAction" method="{1}">
    <result name="relist">Market/save.jsp</result>
    <result name="success">Market/list.jsp</result>
    <result name="successs" type="redirectAction">marketgetAllMarket.action</result>
    <result name="edit" type="json">
    <param name="root">jsons</param>
    </result>
    <result name="error">Market/error.jsp</result>
    </action>

    <!-- 表<Province> <ProvinceAction> 配置 -->
    <action name="province*" class="ProvinceAction" method="{1}">
    <result name="success">MyJsp.jsp</result>
    <result name="successs" type="redirectAction">provincegetAllProvince.action</result>
    <result name="edit">Province/update.jsp</result>
    <result name="error">Province/error.jsp</result>
    </action>

    <!-- 表<County> <CountyAction> 配置 -->
    <action name="county*" class="CountyAction" method="{1}">
    <result name="relist">County/save.jsp</result>
    <result name="success">County/list.jsp</result>
    <result name="successs" type="redirectAction">countygetAllCounty.action</result>
    <result name="edit" type="json">
    <param name="root">jsons</param>
    </result>
    <result name="error">County/error.jsp</result>
    </action>

    </package>
    </struts>


    [quote]Quote?[/quote]
    展开全文
  • <p><img alt="" />数据库模式是不是不支持级联删除啊,我按书上这个,就不行。求解 <p style="text-align:center"><img alt="" height="1080" src=...
  • 数据库系统概论》一:关系数据库的描述1:实体间的联系:1:1、1:n、m:n2:候选码:关系中某一属性组的值能唯一标识一个元组(记录)而其子集不能,则该属性组所包含的属性们称为候选码。主码:若有多个候选码,选...

    f79ab276b772104b835ea55801969879.png

    0a655c32363a15830e675eb085fed384.gif

    《数据库系统概论》

    0a655c32363a15830e675eb085fed384.gif

    一:关系数据库的描述
    1:实体间的联系:1:1、1:n、m:n
    2:候选码:关系中某一属性组的值能唯一标识一个元组(记录)而其子集不能,则该属性组所包含的属性们称为候选码。
    主码:若有多个候选码,选一个作为主码。
    全码:关系模式的所有属性都是候选码,称为全码。

    fc715efbae34f3f1b2dc69650e8fc1ae.gif

    二:关系代数

    1:传统集合运算
      并:两种关系R、S的并集由R跟S的记录合并得到;
      差:R-S的表记录由R表中有而S表中没有的记录组成;
      交:R、S的交集由既属于R表又属于S表的记录组成;
      笛卡尔积:若R有k1条记录,S有k2条记录,则R、S的笛卡尔积有k1*k2条记录,每条记录有r+s列,前r列为R的记录,后s列为S的记录。即:遍历R中每一条记录,在其后面依次拼接S表的记录。共循环了k1*k2次。

    fc715efbae34f3f1b2dc69650e8fc1ae.gif

     2:专门关系运算
      选择:从表中选出符合条件的元组(记录)组成结果表;(行查询)
      投影:从表中选出若干属性列组成结果表(列查询)
      连接:从两个关系的笛卡尔积中选出属性间满足某条件的元组。
      等值连接:从R、S关系的笛卡尔积中,选取R中某些属性值与S中某些属性值相等的元组;
      自然连接:一种特殊的等值连接,选出R、S中同名的属性组的值相等的元组,并在结果中去掉重复的属系列留下一个即可;
      通过自然连接利用两个关系某相同属性把两个表拼接在了一起,此时会出现以下情况:
        悬浮元组:在R、S通过属性B的值拼接时,如果出现R中的某B属性值bn在S中没有相等值,则此时bn所在元组就会被舍弃,不加入结果表中。
        外连接:如果把悬浮元组也加入结果表中,则把bn属性所在行在另一个表中取不到值的列设为NULL值。
        左外连接:只保留左边关系R的悬浮元组。即:R中bn在S中无等值,把R中bn元组加入结果表,元组中属于S的属性列赋NULL值。
        右外连接:只保留右边关系S的悬浮元组。即:S中的bn在R中无等值,把S中bn所在元组加入结果表,该元组中属性R的属性列赋NULL值。

    fc715efbae34f3f1b2dc69650e8fc1ae.gif

    三:SQL语言 1:定义模式(定义数据库):  CREATE SCHEMA 模式名(数据库名) AUTHORIZATION 用户名
      2:删除模式(删除数据库):

    DROP SCHEMA 模式名  [CASCADE|RESTRICT] 级联删除或限制不能删除
      3:创建表:

    CREATE TABLE 表名 (列名 数据类型 约束条件,...);
      4:修改表:

    ALTER TABLE 表名
      5:删除表:

    DROP TABLE 表名[CASCADE|RESTRICT]
      6:数据查询:SELECT[ALL|DISTINCT] 表达式 FROM 表名

    WHERE 表达式 

    GROUP BY 列名     

    HAVING 表达式         

    ORDER BY 列名[ASC|DESC];
      7:插入数据:

    INSERT INTO 表名 属性列名 VALUES(属性值,...,...)
      8:修改数据:

    UPDATE 表名 

    SET 列名=修改值 

    where 条件
      9:删除数据:

    DELETE FROM 表名 where 条件

    fc715efbae34f3f1b2dc69650e8fc1ae.gif

    四:视图
       视图不是一个具体的表,它只不过是一个“窗户”,透过它可以看到某个表中某些特定的数据以及变化。

    fc715efbae34f3f1b2dc69650e8fc1ae.gif

    五:数据库安全
      1:自主存取控制
    通过GRANT、REVOKE赋予用户、角色某些权限或撤销其权限;
      2:强制存取控制
    为用户赋予许可证,为数据设定密级。
    只有当用户许可证级别大于等于数据密级时,才允许读取数据;
    只有当用户许可证级别小于等于数据密级时,才允许写数据;(是写入而不是修改,低等级用户只拥有向表中增加数据的权限,不能查看,不能修改)

    fc715efbae34f3f1b2dc69650e8fc1ae.gif

    六:完整性约束
      1:定义主键:PRIMARY KEY(属性名)
      2:定义外键:FOREIGN KEY(属性名) REFERENCES 外表名(参考属性名)
      3:自定义约束:自定义某属性的约束条件:Check 条件

    fc715efbae34f3f1b2dc69650e8fc1ae.gif

    七:触发器
      触发器又叫 事件—条件—动作  规则。即:某事件(数据库的增删查改)发生前/后—符合某条件—执行某动作

    fc715efbae34f3f1b2dc69650e8fc1ae.gif

    八:关系理论
      第一范式:基本表,表中无表(即属性不可再分)。
      第二范式:在第一范式的基础上,每一个非主属性都可由任意一个主属性推出。
      第三范式:在第二范式基础上,每个非主属性由任意一个主属性直接推出而不传递或部分推出。
      第四范式:每一个主属性都可推出所有非主属性,并且没有任何一个非主属性能推出主属性。

    3db136d19a5857bb3944a9c51b3005f7.gif

    九:数据库恢复
    事务:用户定义的一系列数据库操作,要么全做,要么不做。具有ACID特征:
     原子性:事务不可分割。
     一致性:事务结果使数据库从一个一致性状态变到另一个一致性状态。
     隔离性:事务间相互独立,互不干扰。
     持续性:事务一旦成功提交,对数据库的改变是永久的而不是暂时的。

    fc715efbae34f3f1b2dc69650e8fc1ae.gif

    十:并发控制
      1:数据库并发操作引起数据不一致:丢失修改、不可重复读、读到“脏”数据
      2:封锁技术:事务T操作某个数据对象前先加锁,然后进行操作。在锁释放期间其他事务不能操作该数据对象。分两种:排它锁(写锁,其他事务不能读不能写)、共享锁(读锁,其他事务也可以读)。
      3:死锁:两个事务互相等待对方释放锁,导致死锁。
      4:处理死锁:选择一个造成死锁的最小代价的事务将其撤销,等待其他事务优先执行完再执行。

    fc715efbae34f3f1b2dc69650e8fc1ae.gif

    4ec917a3d1cc32eb231a75649d168fac.png

    展开全文
  • hibernate级联查询

    2012-01-06 16:14:47
    用MyEclipse的Hibernate模式生成pojo和xml文件挺方便的,但是级联查询会导致多次查询操作,有些影响效率呀! 一、数据库表结构 1、用户组表: [code="oracle"]]create table SXF_GROUP ( ID NUMBER...
  • 文章目录一、mysql级联复制1.复制server2上的mysql到server3的指定目录下2.在server3上创建mysql用户并初始化、安装,编辑/etc/my.cnf文件,设置环境变量3.备份数据库中已有的文件并导入server3数据库中4.在server2上...
  • EntityFramework级联删除的操作方式

    千次阅读 2013-12-18 18:12:16
    相关文章: http://www.cnblogs.com/brusehht/archive/2010/08/26/1809055.html ... //级联删除总结 1.为了快速开发一般使用数据库优先模式 我们在数据库
  • 由于刚转型到MVC,MVC的架构模式很多不是很清楚,比如今天就想做个级联的操作,因为之前的ASP.NET的方式是通过:控件-->添加事件-->后台编写级联事件进行触发,但是这个MVC就不同了。于是乎,开始网上搜寻相关...
  • 数据库系统原理

    2015-07-24 14:24:00
    目录 数据库系统原理 概念 一 关系数据库 关系 连接 关系代数 SQL 级联、限制 数据类型 模式 索引 查询 ...
  • 数据库SQL外键设置

    2021-01-31 18:03:40
    创建约束 alter table user_relation add CONSTRAINT `fk_deleteUser` FOREIGN KEY (`account`) REFERENCES `sys_user` (`... 表名 外键名 表字段 外键关联表 外键关联字段 删除时 级联模式 更新时 不做任何操作
  • 数据库模式: <pre name="code" class="sql">Board(board_id) Article(article_id,board_id) Comment(comment_id, article_id)   <br>设置级联删除,也就是删除Board时,会自动级联删除和Board关联的所有...
  • 数据库引论 第三章 关系数据库语言-SQL SQL体系结构: SQL的数据定义 SQL模式的创建和撤销 CREATE SCHEMA <模式名> AUTHORIZATION <用户名> //创建 DROP SCHEMA <模式名> [CASCADE|RESTRICT] //...
  • 关系模式R满足第一范式,当且仅当其所有属性均满足原子性。 对于关系数据库,所有数据库中的关系模型都应当满足第一范式。 第一范式下关系数据库的缺陷 可能存在冗余,包括存储与查询方面 更新时可能产生异常(表的...
  • 换句话说如果关系模式R1中的某属性集不是自己的主键,而是关系模式R2的主键,则该属性集称为是关系模式R1的外键。 二:主键表和外键表的理解 (1)以公共关键字作主键的表为主键表(父表,主表) (2)以公共关键字...
  • 数据库实验报告

    2017-12-14 23:37:15
    2. 定义SC表的完整性约束,要求当其被参照表发生删除操作时,违约处理的方式为级联,当其被参照表发生修改操作时,违约处理的方式为拒绝。 3. 触发器 ☆ 建立一DML触发器,每当学生的成绩发生更新时,将更新的学号,...
  • MySQL数据库学习笔记

    2021-03-12 04:34:46
    文章目录数据库分类mysql目录结构启动系统服务MySQL的重要概念简单的SQL操作设置密码忘记密码配置文件***基本语句*存储引擎MySQL中的数据类型浮点型字符类型*严格模式时间类型枚举与集合类型补充创建表的完整语法...
  • sql命令 1、数据定义 1.1 模式 1,11 创建模式 CREATE SCHEMA 模式名 AUTHORIZATION ...删除模式的同时把模式中所有的数据库对象全部删除 RESTRICT(限制) 如果该模式中定义了下属的数据库对象(比如:表,视图等...
  • 数据库外键约束的几种方法及区别

    千次阅读 2019-04-10 21:54:15
    1、cascade级联模式 ,父表的操作,对应的子表关联的数据也跟着操作 2、district :严格模式(默认的),父表不能删除或更新一个已经被子表数据引用的记录。 3、set null:(置空模式)父表被操作之后,子表对应的外键...
  • 数据库-sql语句

    2017-09-02 23:13:32
    一、sql模式 1、sql模式的创建:creat schema<模式... ①cascade(级联式)方式:执行drop语句时,把sql模式及其下属的基本表、视图、索引等所有元素全部删除。 ②restrict(约束式)方式:执行drop语句时,只有当s
  • Zabbix 数据库迁移

    2018-06-12 10:23:00
    背景:ZABBIX的环境是LNMP,MySQL的架构是M-M主备模式,单台服务器SSD硬盘800G。监控主机日渐增多,空间不足,迁移到同样架构下的SAS盘2T空间。 架构:A 192.168.0.100 -> B 192.168.0.101 -> C 192.168.0....
  • 1.master---slave模式 master负责R/W,slave 从master复制binlog备份数据,主要解决读取瓶颈 2.master---master模式 主要针对master部分维护时停机问题,这样两个master互为master--slave ...MYSQL数据库常用...
  • CASCADE:级联,表示在删除模式的同时把该模式中所有的数据库对象全部一起删除。 RESTRICT:限制,表示如果该模式中已经定义了下属的数据库对象,则拒绝该删除语句的执行。1、 定义基本表 CREATE TABLE <表名> (...
  • 目录 一、主从复制的概念 二、主从复制的原理 1、主节点 binary log dump 线程 2、从节点I/O线程 ...5、级联复制 五、主从复制的模式 1、异步模式 2、半同步模式 3、全同步模式 六、复制类型 ...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 158
精华内容 63
关键字:

数据库级联模式