之前有人问过我rownum的问题,当时没有完整的回答下来,事后弥补一下
将所有相关的类型都存在一张表中,为所有类型的所有属性都保留一列。所以,当系统中新增添了一个子类型时,我们都需要将它的属性逐一添加进数据库表中,也就是改变表的结构,添加新的列。同时要保证2点:必须有一列能够区分出每一行的子类型;列允许空值。
1 | CREATE TABLE Issues ( |
为每个子类型建一张独立的表。每个表都包含属于父类的属性,同时也有子表所特有的属性。这种设计也比较简单明了,无非就是一种类型一张表。所以我们缺少元数据,搞清楚子表之间的关系(我们会发现数据库中某些表有重复的属性,却不知其缘由)。
首先创建一张父表,包含了公共属性。而其他的子表通过外键去和父表关联。
1 | CREATE TABLE Issues ( |
在这种设计中,数据库的表之间的父子关系由元数据来确保,是一个不错的设计,唯一没有解决的是扩展问题。当需要经常增加新属性时,还是不得不改变表结构,增加新的列。
在日常生活中会遇到一种场景——多值属性,比如电话号码,手机、工作的、家庭的、小灵通、IP电话…一个人可能拥有其中一种或者每一种。如果将这些值存储在一列中,势必要用到分隔符,这会导致sql操作的复杂、也无法确保数据的正确性。如果用多列存储,不优雅。因为每次查询一个人的电话时,需要扫描每一列;每当增加或者删除一种通讯工具时,需要重构整张表;数据库中可能存在更多的null列。不过,当我们在设计数据库时,所以如果想采用多列存储某种类似的属性,首先要保证分开的这些列是可区分的,且列的数目是固定的。
但是还有更好的办法是创建另一张新表,将多列属性转化为多行存储。(这个例子可能不是最恰当的)
1 | create table communication ( |
利用标签将不同的值分在多行存储起来,多列——>多行;同时又有外键关联,将人和信息联系在一起;同时查询、更新、删除都变得简单;支持或取消对某种通讯工具的支持(增加或删除某种通讯工具),也同样不需要重构数据库,只需要来个遍历,删除相应的行即可。
PS:当然了,这里所提到的多列属性是违反第一范式的设计。在一张表中,多个列拥有了相同的值域,这不能满足关系数据库的基础。关系中的每一行(每一条记录)都是从不同数据域上选择一个值而形成的组合。
最近看到了一本好书《SQL Antipatterns》,作者(Bill Karwin)非常厉害,他在关系型数据库上的开发经验非常丰富,总结出了sql设计时经常陷入的误区(反模式)。这本书的在线版本:SQL Antipatterns,非常值得一读!!!
这是以前在sap实习做项目的时候遇到的问题:studio中的property grid的定制。本身并不是很复杂,微软本身提供的editor具备很强的扩展性,只需要你用心地了解其使用方法,大概就齐了。└(^o^)┘
第一次接触ruby的时候,我对于很多“黑魔法”的事情感到疑惑。相比于编译型语言,动态语言太灵活了。不过深入了解之后,我对于ruby或者松本行弘的一些想法也蛮佩服的。比如open class、完全的面向对象、纤程以及实现继承与接口继承等,印象很深刻。虽然ruby的性能经常被人诟病,但平时确实可以拿来玩玩
ruby的gem本质上是一个软件包,从这里http://rubygems.org/可以了解更多的信息。通过安装可以获得很多额外的功能。它的功能,我觉得很像nodejs的npm,java的maven,可以很方便地管理各种开源的软件,便于大家下载使用。如何建一个gem包,步骤也不复杂。(详情请戳这里http://guides.rubygems.org/make-your-own-gem/)