`

DBMS里的一些"自圆其说"

阅读更多
DBMS里的一些"自圆其说"

再次看Hibernate时,发现自己又一次地让SQL里的"foreign key"和"References"这个两个关键字给缠上了.

<JavaPersistenceWithHiberante>这本书在讲"Object-oriented domain model"和"peresistent relational"间的不匹配时有这样一个例子:

假设要设计一个网上电子商务的系统,有两个很基本的类来描述那些基本信息:User和BillingDetails.

如下是这两个类的属性:

    public class User{
        private String username;
        private String name;
        private String address;
        private Set billingDetails;

        //.....
    }    

    public class BillingDetails{
        private String accountNumber;
        private String accountName;
        private String accountType;
        pirvate User user;

        //........
    }

建表时的Schema是这样的:
    create table USERS(
        USERNAME varchar(15) not null primary key,
        NAME varchar(50) not null,
        ADDRESS varchar(100)
    )

    create table BILLING_DETAILS (
        ACCOUNT_NUMBER varchar(10) not null primary key,
        ACCOUNT_NAME varchar(50) not null,
        ACCOUNT_TYPE varchar (2) not null,
        USERNAME varchar(15) foreign key references user
    )

这些与Hibernate根本没什么关系,说到底一些理解上的不足是自己的数据库知识不扎实.

由于没有自己设计数据库应用的经验,对这两个表间的关联关系设计成这样是可以理解,但经类似"为什么不那样呢?"的提问后就把自己陷进一个泥滩了:
    1,关于"foreign key"的理解:为什么叫"foreign key"呢?是什么特征让它成foreign了,不被看成"自己人"?对此我有两种"自圆其说",(1)BILLING_DETAILS表中的这个USERNAME实际上是USERS表安插到BILLING_DETAILS表里的一个"卧底",通过这种"卧底"的方式,DATABASE MANAGEMENT SYSTEM就可以有效地监测并"上报"BILLING_DETAILS表中的USERNAME是否有越USERS表中所列USERNAME之轨的行为.也就是说BILLING_DETAILS中的USERNAME必须是USERS中USERNAME的子集,而这种子集的表现与保证DBMS是通过"foreign key"来实现的.(2)第二种"解释"就太牵强,也有些搞笑了,由于BILLING_DETAILS表中已有ACCOUNT_NUMBER来当"primary key"了,那能容忍你一个外来的"USERNAME"当什么key呀?强龙压不过地头蛇嘛,不过为了照顾各方面的关系就安排你来作为了个"foreign key"吧.

    经过上面的"自圆其说"后,现在心里亮堂些了:DBMS通过"primary key"来保证表内数据(也就是记录间)Integrity,而表间的Integrity是以"foreign key"的形式来保证的.

    现在"foreign key"的问题解决后,references的问题就迎刃而解了.

    2,下一个话题:那为什么不在USERS表里建"foreign key references"来替换现在的样式而达到表间数据Integrity的效果呢?没法建?可以通过添加ID方式来实现呀.

    通过下面的方式不就实现了吗?
    create table USERS(
        USER_ID int not null primary key,
        USERNAME varchar(15) not null,
        NAME varchar(50) not null,
        ADDRESS varchar(100),
        BILLING_DETAILS_ID foreign key references BILLING_DETAILS
    )

    create table BILLING_DETAILS (
        BILLING_DETAILS_ID int not null primary key,
        ACCOUNT_NUMBER varchar(10) not null,
        ACCOUNT_NAME varchar(50) not null,
        ACCOUNT_TYPE varchar (2) not null        
    )
    (呵呵,干的漂亮!我看你怎么解释?)
    这个怎么来"自圆其说"呢?这个嘛.................还是且听下回分说吧.
    

   
3
3
分享到:
评论

相关推荐

    DBMS_XMLDOM DBMS_XMLPARSER DBMS_XMLQUERY 文档

    Oracle数据库系统提供了强大的XML处理能力,这主要体现在其内置的几个PL/SQL包上,如DBMS_XMLDOM、DBMS_XMLPARSER和DBMS_XMLQUERY。这些包为开发者提供了处理XML文档的一整套工具,使得在数据库环境中进行XML数据的...

    DBMS_dbms_javascript_

    【DBMS_dbms_javascript_】这一主题涵盖了数据库管理系统(DBMS)与JavaScript在交互和数据处理中的应用。JavaScript,作为一种广泛使用的客户端脚本语言,不仅限于网页开发,也日益成为服务器端和数据库交互的重要...

    dbms源码课程设计

    下面我们将详细探讨DBMS的一些核心概念和实现技术。 1. **数据库模型**:DBMS的基础是数据库模型,如关系模型(Relational Model),这是最常见的一种,由E.F. Codd在1970年提出。关系模型基于表格结构,每个表代表...

    oracle dbms_lob

    Oracle数据库系统中,`DBMS_LOB`是一个重要的PL/SQL包,专门用于处理大型对象(LOBs,Large Object)。LOBs是Oracle提供的一种数据类型,用于存储大量数据,如文本、图像、音频或视频文件等。这个包包含了各种过程和...

    DBMS

    3. MYFUNC.CPP:这是一个自定义函数库,可能包含了一些特定的数据处理或业务逻辑函数。 4. Dbms.exe:这是编译后的可执行文件,是整个DBMS程序的运行形式,可以直接在操作系统上运行。 5. key.h:头文件,可能包含了...

    DBMS系统架构 ppt

    数据库管理系统(DBMS)是计算机科学中的核心组成部分,它负责管理和操作数据的存储、检索、更新和删除。在本系列的PPT中,我们将深入探讨DBMS系统架构的多个关键方面,包括其基本概念、数据存储、数据表示、索引...

    DBMS_SQL的使用

    ### Oracle DBMS_SQL 使用详解 #### 一、概述 在Oracle数据库中,`DBMS_SQL`包是一个功能强大的工具,用于执行动态SQL语句。它提供了处理动态SQL语句的能力,使得开发人员能够灵活地构建和执行SQL语句,而不需要...

    DBMS的设计与实现

    在IT领域,数据库管理系统(DBMS)是至关重要的软件组件,用于存储、管理和检索数据。本项目以"DBMS的设计与实现"为主题,旨在通过构建一个原型系统来理解和掌握DBMS的核心概念和技术。这个系统应该能够处理基本的...

    DBMS_c.rar_C语言实现DBMS_DBMS_c_c语言DBMS_dbms

    在 C 语言实现的 DBMS 中,以下是一些关键知识点: 1. **数据模型**:首先,理解数据是如何组织的至关重要。C 实现的 DBMS 可能基于关系模型,其中数据以表格的形式存储,每个表由一系列列组成,列之间可能存在特定...

    用C++编写的DBMS

    在IT领域,数据库管理系统(DBMS)是至关重要的软件组件,用于存储、管理和检索数据。本文将深入探讨一个使用C++编程语言实现的DBMS,这对于C++初学者或者对数据库系统感兴趣的开发者来说是一个很好的学习资源。 ...

    DBMS.rar_dbms_dbms举例_dbms有什么例子

    "DBMS"文件可能是一个数据库实例,包含了一些实际的数据表和查询,用于演示如何在实际环境中操作DBMS。例如,它可能展示了如何创建数据库,定义数据表结构,插入记录,执行查询,以及如何实现数据完整性,如实体完整...

    使用dbms_stats包手工收集统计信息

    Oracle 数据库中使用 dbms_stats 包手动收集统计信息 在 Oracle 数据库中,dbms_stats 包提供了一种手动收集统计信息的方式,包括基于表、用户和索引的统计信息。通过使用 dbms_stats 包,我们可以手动收集统计信息...

    dbms.rar_DBMS visual c++_DBMS Visual C++_c dbms_dbms

    DBMS,全称为数据库管理系统(Database Management System),是用于创建、管理、操作和控制数据库的软件。在本项目中,我们看到的是一个基于DOS环境的简单DBMS系统,使用了Visual C++作为编程工具。Visual C++是...

    经典DBMS 课程设计

    经典DBMS课程设计 DBMS(Database Management System,数据库管理系统)是计算机科学系的重要组成部分,本篇课程设计旨在实现一个经典的miniDBMS系统,提供了CREATE SCHEMA、CREATE TABLE、INSERT、SELECT、DROP ...

    C++ 编写的小型DBMS

    在信息技术领域,数据库管理系统(DBMS)是用于存储、管理和检索数据的核心工具。本篇文章将深入探讨一个基于C++编程语言编写的微型DBMS,它虽小巧但具备了数据库管理的基本功能,特别适合初学者了解数据库系统的...

    自己做的简单的DBMS

    数据库管理系统(DBMS)是计算机科学中的一个关键领域,它是一种用于存储、管理和检索数据的软件系统。在本文中,我们将深入探讨一个简单的DBMS,它由个人制作,主要功能包括基本的增删改查操作。 一、数据库管理...

    西电编译原理上机报告DBMS的设计与实现

    西电编译原理上机报告DBMS的设计与实现

    dbms_stats.docx

    ### DBMS_STATS在Oracle数据库中的应用 #### 一、DBMS_STATS概述 DBMS_STATS是Oracle提供的一款功能强大的工具包,主要用于收集表和索引的统计信息,进而帮助Oracle的Cost-Based Optimizer (CBO)生成更为高效的执行...

    DBMS.rar_dbms_dbms过代码

    在本资源"DBMS.rar_dbms_dbms过代码"中,包含了一个简易的DBMS源代码,允许用户执行基本的数据库操作,如数据插入和查询,以及处理SQL语句。下面将详细探讨DBMS的基础概念、主要功能以及实现这些功能的基本代码结构...

    DBMS历史及发展趋势

    数据库管理系统(DBMS)的历史及发展趋势是一个充满创新与变革的过程,这一历程不仅反映了信息技术的演进,也预示着未来数据管理的方向。自上世纪中叶以来,DBMS经历了从简单的数据存储方式到复杂的数据管理系统的...

Global site tag (gtag.js) - Google Analytics