关键字: Database database sybase
需求很简单:
- 1:一个对象,它对应数据库中的一条记录。
- 2:这个对象可能有很多boolean属性,例如isXX1, isXX2, isXX3,isXX4(但是有限,未来还可能增加)。
- 3:这个对象的这些属性在应用中可能被频繁的更新。
设计方案
方案1:
- 对象主表,用于保存对象常规属性,例如,id,name等等。
- 对象boolean属性表,跟对象主表外键关联。
方案2:
- 对象主表中多一个字段bool_status
- 用二进制的byte来表示对象的boolean属性
- 例如:isXX1 = 1, isXX2 = 2, isXX3=4, isXX4=8, isXX5=16
- 然后bool_status存放所有boolean属性之和。
- 例如对象A拥有issXX1=true, isXX2=true,那么这个对象在数据库中bool_status的值就是3
- 例如对象b拥有issXX1=true, isXX5=true,那么这个对象在数据库中bool_status的值就是17
简单分析利弊:
对于一个对象查询:
- 方案1:需要2条sql才能查出一个对象
- 方案2:一条sql就可以查出一个对象
对于一个对象插入:
- 方案1:一定是1+cont(boolan_attr=true)条insert sql
- 方案2:一条update sql
对于一个对象boolean属性的更新:
- 方案1:1条delete+cont(boolan_attr)条insert sql
- 方案2:一条sql就可以更新
对于一个对象的删除,都暂不考虑记录历史
- 方案1:1条delete主表+1条delete bool属性表
- 方案2:1条delete主表
对于空间占用:
通过上面的分析好像天平已经很明显倒向了方案2.但是方案2也有一些弊端
- 1:对于统计不是很友好,例如针对统计对象的没个属性进行统计,某些属性的组合进行统计,那么对于方案2就不得不对表中所有的bool_status进行&计算,这个不利于数据库运用索引。
- 2:如果一个对象的boolean属性有很多是true那么bool_status这个值望望会令人不知所云,一定要应用程序decode才能看出来这个对象到底那些boolean属性是true。
我更倾向于方案1,因为它更清晰,插入和更新的效率虽然不如方案2,但是我更看重程序设计的清晰性,不知道大家有什么见解? |
分享到:
相关推荐
- **图ADT实现设计**:如何根据图的抽象数据类型来设计具体的实现方案。 - **图的遍历**:介绍了图的两种基本遍历方法:深度优先搜索(Depth-First Search, DFS)和广度优先搜索(Breadth-First Search, BFS)。 - **图...
布尔型是一种数据类型,只能取两个值:真 (True) 或假 (False)。 **浏览模式 (Browse Mode)** 浏览模式是指用户在应用程序中查看数据的方式,通常是通过导航界面进行的。 **内置函数 (Built-In Functions)** ...
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 finally是异常处理语句结构的一部分,表示总是执行。 finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的...
其次,模块有两种主要类型:类模块和标准模块。类模块,如窗体和报表模块,其作用域局限于所属的窗体或报表,随它们的打开和关闭而生灭,主要处理与自身或与其他对象的交互。标准模块则具有全局作用,作用于整个应用...
- **Huffman树及Huffman编码:** Huffman树是一种用于数据压缩的特殊二叉树,其编码方案能够有效地减少数据的存储空间。 #### 图 **知识点:** 1. **图的定义:** - 图是由顶点集和边集组成的集合。 - 图的...
每种数据类型都有其特定的运算符和运算规则。 - **流程控制语句**:主要包括条件语句(如`if...else`)和循环语句(如`for`, `while`),用于控制程序的执行流程。 - **字符串**:在Java中,字符串是不可变的对象,...
它们帮助设计者将新的设计建立在以往工作的基础上,复用以往成功的设计方案。 一个熟悉这些模式的设计者不需要再去发现它们,而能够立即将它们应用于设计问题中。以下类比可以帮助说明这一点。 小说家和剧本作家很...
- Java支持八种基本数据类型,包括四种整型(`byte`、`short`、`int`、`long`)、两种浮点型(`float`、`double`)、一种字符型(`char`)以及布尔型(`boolean`)。每种类型都有其特定的取值范围。 - 运算符主要...
**二进制大对象**:一种数据类型,用于存储大量的二进制数据,如图像、音频文件等。 #### Binary Operator **二元运算符**:需要两个操作数才能工作的运算符。 #### Binary Search **二分查找**:一种高效的查找...
它可以帮助我们构建更加简洁、高效的设计方案。抽象主要分为两个方面: - **过程抽象**:指对方法或行为的抽象,即只关心方法的输入和输出,而不关心具体的实现细节。 - **数据抽象**:指对数据结构的抽象,即只...
VB.NET是一种基于.NET Framework的编程语言,主要用于构建Windows桌面应用程序和Web应用程序。它属于面向对象的编程语言,具有直观易用的特性,尤其适合初学者。以下是对VB.NET的一些核心知识点的详细说明: 1. **...
- **基本数据类型**:Java提供了八种基本数据类型,包括四种整型(byte、short、int、long)、两种浮点型(float、double)、一个字符型(char)和一个布尔型(boolean)。 - **算术运算符**:包括加(+)、减(-)...
Sub过程和Function函数是过程的两种形式。 4. **事件驱动编程**:VB的一大特点就是其事件驱动编程模型。用户界面的控件如按钮、文本框等都有对应的事件,当这些事件触发时,会执行预先定义的事件处理程序。 5. **...
26. **Template**: 模板,预设的设计或格式方案。 27. **Slide**: 幻灯,演示文稿中的单个页面。 #### 二、编程基础词汇 (Programming-based Vocabulary) 1. **Computer**: 计算机,一种能够接收、处理并存储数据...
14. 两种常见的软件生命周期模型有瀑布模型(Waterfall Model)和敏捷开发模型(Agile Development)。瀑布模型按照顺序进行需求分析、设计、编码、测试和维护;敏捷模型强调迭代和灵活响应变化。 15. 设计线程程序...
- **类**:一种定义对象的蓝图,包含了对象的属性和方法。 - **对象**:类的实例,具有特定状态和行为。 #### 四、Visual Basic.NET 的常用控件 Visual Basic.NET 提供了大量的控件来帮助开发者快速构建用户界面,...