`
阅读更多
这篇本来应该是给xiang和kaka的回复,不过回复的小框框实在是太小了,呵呵,就发到这里,当作《扩展表设计》的续篇吧。

假设一个M系统,系统中有许多模块都需要用到扩展数据。首先,我们把每个需要使用扩展数据模块的代号存在扩展表的主表中:

    OID            INF_CODE            INF_URL        INF_STATUS            INF_DESC
  1111...        CUSTOMERDATA        ...                    USE            CUSTOMER DATA        //用于客户数据
  1122...            CPUDATA               ...                    USE                CPU DATA                //用于CPU数据

OID是当前模块的扩展表的GUID,INF_CODE相当于一个标识符。INF_STATUS是表示被使用/不被使用。

接下来,对每一个模块,我们要存下它所需要存数据的栏位:

  OID        FLD_INFOID    FLD_CODE    FLD_NAME    FLD_SEQN    FLD_DATATYPE    FLD_STATUS    FLD_DESC
  2211...         1111...       WIFE_NAME    妻子姓名        0                    string                USE             客户妻子姓名
  2212...         1111...         CID_SEX       孩子性别        1                  dropdown            USE             客户孩子性别
  2221...         1122...        OLD_FRE      打磨前频率    0          decimal               USE            CPU打磨前频率
  2222...         1122...        REM_BRA       打磨批次      1                   string                 USE        打磨批次

这里OID是当前栏位的GUID。FLD_INFOID是关联到前面主表的OID的外键,表示当前这一列属于哪一个模块。FLD_DATATYPE是限定当前列所填值的类型。FLD_SEQN是这一列的显示顺序。

对于dropdown类型的值,把他们可选的下拉值存在选择值表中。这里存的是关于孩子性别的选择项:)

  OID    OPT_FLDOID    OPT_VALUE    OPT_KEY    OPT_DEFAULT    OPT_STATUS    OPT_DESC
  3321...        2212...                    男                  MALE                TRUE                USE               性别:男
  3322...        2212...                    女                FEMALE              FALSE              USE                性别:女

OID是选择值的GUID。OPT_FLDOID是关联到上面栏位表OID的外键,表示当前的选项是哪一列的。

前面的三张表就完成了各个模块的扩展表的格式(即列信息)定义:列、数据类型、顺序、可选值。接下来,就需要存取扩展表的数据(也就是行信息)了。

不论数据是多么的扩展,任何一条扩展数据都要对应到具体的实例上。比如说,客户模块的扩展数据,就需要对应到是客户INTEL的还是客户AMD的,毕竟INTEL和AMD的妻子和孩子可不能共用呀。因此,在扩展数据的明细表之前,我们首先需要定义扩展数据和模块中的具体实例的连接关系。这就是扩展信息表的作用。

假设客户数据表中INTEL的OID是0001...,AMD的OID是0002...。CPU数据表中XEON的OID是0003...,HAMMER的OID是0004...。

 OID    REC_INFOOID    REC_OBJOID    REC_STATUS    REC_DESC
4411...        1111...                0001...                    USE                客户:INTEL
4412...        1111...                0002...                    USE                客户:AMD
4421...        1122...                0003...                    USE                CPU:XEON
4422...        1122...                0004...                    USE                CPU:HAMMER

OID是一条扩展信息的GUID,REC_INFOOID是关联到前面第一个主表的某一个模块的外键。独特的REC_OBJOID是对应到具体模块的数据表中具体实例的OID。如果当前这条扩展信息是客户模块的,则此处关联客户数据表中的OID。如果当前这条扩展信息是CPU模块的,则此处关联CPU数据表的OID。这里虽然不是外键,但是表示的却是外键的含义。

上面的扩展信息表定义了扩展表每一行信息的归属。最后,我们需要真正的填入扩展信息的明细——也就是行内每一列的数据了。这就是最后一张表,也是数据量最大的一张表:扩展信息明细表。

 OID        RCD_RECORDOID   RCD_FLDOID        RCD_RECODE
5511...                4411...                        2211...                        AUDERY            //INTEL的妻子姓名
5512...                4411...                        2212...                        3322...             //INTEL的孩子性别:女,从选择值表取出
5513...                4412...                        2211...                        HERBEN            //AMD的妻子姓名
5514...                4412...                        2212...                        3321...             //AMD的孩子性别:男,从选择值表取出
5521...                4421...                        2221...                        800                  //XEON打磨前频率:800Hz
5522...                4421...                        2222...                        04-09-08          //XEON打磨批次:04-09-08
5523...                4422...                        2221...                        2400                //HAMMER打磨前频率:2400Hz
5524...                4422...                        2222...                        04-09-14          //HAMMER打磨批次:04-09-14

OID是具体明细的GUID。RCD_RECORDOID是对应上一个扩展信息表的OID的外键,表示属于哪一个具体实例。RCD_FLDOID是关联到扩展栏位的OID,表示当前的数据是哪一列下的数据。RCD_RECODE存储的就是具体的明细值了。注意到两个孩子性别,数据都是存的选择值表的对应选项的OID。由于他们的栏位信息已经表明其类型为dropdown,我们就可以从选择值表中取出其应有的数据。

后两张表的信息就是扩展表的行信息了。如果取出来看,我们可以得到以下的结果:

客户数据的扩展表信息:

    客户INTEL的扩展表信息:

        妻子姓名      孩子性别
        AUDERY            女

    客户AMD的扩展表信息:

        妻子姓名      孩子性别
        HERBEN            男

CPU数据模块的扩展表信息:

    XEON的扩展表信息:

        打磨前频率         打磨批次
            800              04-09-08

    HAMMER的扩展表信息:

        打磨前频率          打磨批次
            2400             04-09-14

可惜看到,上面的行和列信息都是从扩展表五张表中取出的。这样,我们就实现了“用表来存表”的功能。同时,这些数据也很容易添加到具体实例的显示内容里(比如可以将INTEL的扩展信息和INTEL的原始信息一起展现),对应付需求变更和数据库结构改变也很有效果。

注:以上数据纯属虚构,只是为了说明有些时候,有些数据不方便直接添加到原来的主表中(比如客户妻子和孩子的信息就不方便直接加入客户数据表中,CPU打磨的信息更不方便直接显示出来),但有些也确实有用(客户的妻子孩子的信息对进行CRM也是有帮助的。)这也算是扩展表的一些特殊用处吧。

注:GUID应该是36位的唯一标识符,此处受长度和视觉效果所限,进行了简化处理
分享到:
评论

相关推荐

    oracle数据库扩展表空间代码

    此SQL语句可以帮助我们获取所有表空间的总大小、已使用大小、剩余大小以及使用百分比,从而为扩展表空间提供依据。 #### 三、创建新的表空间 在Oracle中创建一个新的表空间可以通过以下SQL命令实现: ```sql ...

    Oracel扩展表空间

    ### Oracle扩展表空间知识点 #### 一、Oracle表空间概述 在Oracle数据库中,表空间是逻辑存储单元,用于组织和管理数据。每个表空间由一个或多个数据文件组成,这些数据文件存储在物理磁盘上。表空间分为系统表...

    扩展表空间

    此外,还可以使用其他方式来扩展表空间的尺寸,例如:增加数据档案。例如: ```sql alter tablespace 表空间名称 add datafile '新数据档案的储存位置' size 新数据档案的尺寸; ``` 例如: ```sql alter tablespace...

    为数据库表设计可扩展的字段

    此外,考虑使用范式化的关联表也是一种扩展性策略。例如,如果一个“订单”表需要频繁地添加新的商品属性,可以创建一个`order_item_attribute`表,包含订单项ID、属性ID和属性值。这种方式保持了数据的规范性,同时...

    oracle扩展表空间方案

    当表空间的容量不足时,可能会导致数据库操作失败,如异常`ORA-01653`,提示无法在指定的表空间中扩展表。本文将深入探讨如何检查Oracle表空间的占用情况以及如何扩展表空间。 首先,为了监控表空间的使用情况,...

    ORACLE_表空间扩展方法

    在扩展表空间之前,我们需要了解当前表空间的使用情况,包括表空间的总大小、已使用的大小、剩余的大小、使用百分比等。我们可以使用以下语句来查询表空间使用情况: ```sql select a.tablespace_name, a.bytes/...

    ExpandingStackCells, 在 iOS 9中,使用UIStackView扩展表视图单元.zip

    ExpandingStackCells, 在 iOS 9中,使用UIStackView扩展表视图单元 ExpandingStackCells使用栈视图创建扩展表视图单元的示例代码,在 iOS 9中引入。 什么是堆栈视图?UIStackView 是在 iOS 9中引入的一个视图。 它的...

    红狮现场仪表PAX仪表可选扩展表PAXCDC1手册.pdf

    红狮现场仪表PAX仪表可选扩展表PAXCDC1手册中的内容涉及了RS-485串口通讯卡的安装、配置和操作指导。手册详细介绍了PAX系列仪表中RS232和RS485通讯卡的使用方法,这些通讯卡是用于PAX仪表家族的扩展插件卡。本文将...

    电路分析基础实验-仪表量程的扩展法.ppt

    电路分析是电气工程学科中的核心内容,其中涉及到的关键技能之一就是如何正确使用和扩展仪表的量程。本实验旨在让学生深入理解指针式毫安表的工作原理,掌握毫安表转换为电流表和电压表的方法,以及学会电流表和电压...

    红狮现场仪表PAX仪表可选扩展表PAXCDC4手册.pdf

    2. PAXCDC4通信卡:文件中描述的PAXCDC4是一种可选扩展卡,用于红狮(Red Lion)现场仪表PAX系列的表计设备。这款通信卡可让PAX仪表通过Modbus RS485通信,支持RTU和ASCII两种通信模式,以传输显示值、设定点和复位...

    表空间暴长后如何才能取消自动扩展

    ### 表空间自动扩展原理与取消自动扩展方法 在Oracle数据库管理中,表空间的管理是一项重要的任务。当表空间设置为自动扩展时,随着数据的增长,表空间也会自动增加其大小,以适应数据存储的需求。然而,在某些情况...

    oracle分区表之hash分区表的使用及扩展

    Oracle分区表中的Hash分区是一种基于哈希算法的分区策略,适用于...在实际应用中,创建和扩展Hash分区表时,应结合业务需求和数据特性,综合考虑分区键的选择、分区数的设定以及扩展策略,以实现最佳的性能和管理效果。

    oracle表空间大小及使用情况

    运维脚本,查询数据库表空间大小及使用情况,增加表空间,扩展表空间等。

    Oracle 12CR2查询转换教程之表扩展详解

    表扩展是一种策略,允许数据库优化器根据需要选择使用或不使用索引来访问分区表的不同部分,从而平衡读写性能与索引维护成本。 在传统的分区表中,如果创建了局部索引,优化器通常会选择使用索引来提高查询速度。...

    bootstrap table 扩展表 v1.18.1

    为您提供bootstrap table 扩展表下载,bootstrap table是一个具有单选,复选框,排序,分页,扩展和其他附加功能的扩展Bootstrap表。特征:为Twitter Bootstrap创建(支持所有版本)响应式网页设计具有固定标题的可...

    如何使用SQL CLR表值函数进行扩展

    使用SQL CLR表值函数扩展Reporting Services,可以为报表提供自定义的数据处理逻辑,这在处理非结构化数据、需要复杂计算或与外部系统交互时非常有用。例如,可以读取XML文件、调用Web服务、处理JSON数据等。 除了...

    ASCII打印表包括扩展字符

    ASCII表的全面性在于它包含了这些基本的7位ASCII字符,并且通常还会包括扩展ASCII,这是一个更广义的概念,指的是在标准ASCII基础上增加的更多字符集。 扩展ASCII是为了满足更多语言和特殊符号的需求,通常使用8位...

    使用扩展SQL跟踪数据诊断性能

    【使用扩展SQL跟踪数据诊断性能】 在数据库性能优化领域,正确地诊断问题至关重要。本文以Oracle数据库为例,探讨如何利用扩展SQL跟踪数据来有效地找出性能瓶颈。作者Cary Millsap指出,传统的检查清单方法,如关注...

    GBK 汉字内码扩展规范编码表(二).txt

    ### GBK汉字内码扩展规范编码表(二) #### 知识点一:GBK编码标准简介 - **定义**:GBK(汉语内码扩展规范)是中国国家标准GB2312的扩展版本,由国家技术监督局发布。它包含了GB2312的所有汉字和符号,并新增了大量...

    db2裸设备扩容表空间

    本篇文章将详细介绍如何在AIX操作系统上对DB2的裸设备进行扩容,以及涉及的表空间扩展过程。 首先,我们需要理解表空间在DB2中的作用。表空间是DB2数据库中逻辑存储的容器,用于组织和管理数据库对象如表、索引等。...

Global site tag (gtag.js) - Google Analytics