PowerDesigner的确是一个很不错的工具,进行数据库设计可以说是战无不胜,但是它也并不是万能的,有很多地方用起来也不是很爽,今天研究了好久有关自动递增列的生成问题总结如下:
1、有一点我准必须明白,那就是Oracle中是没有像SQLServer中那样的原生的递增列的,但是在Oracle中有一个Sequence,可以生成一个序列,可以完成这样的工作。
2、我们使用自动递增序列很多情况下是用它来做主键,为什么要用自己递增列来做主键?有很多时候除了自动递增列我准还会有不重复的列如:Name列等,也可以做主键的列,为什么不用这些列来做主键呢?原因是这样的,我们用主键来唯一的标志一条数据,为了能在其他表中引用这条数据并且占用不必要的空间尽可能的小,所以我们用数据来做主键,这样在其他表中加一个外键也声明为Interger类型的就可以,而不必要用一个字符串(用Name做主键时有这样的情况),减少空间的占用。(根据Oracle的设计来看,在Oracle中是不提倡用自动递增的列来做主键的,但SQL Server是提倡这样做的,对于像我这样是从SQL Server改到Oracle的用户来说可能比较习惯这样做吧。)
3、在PowerDesigner中,如果想要一个列是自动递增的列,只要声明这个列为Serial类型就可(在Concept Data Model和Logical Data Model中),在生成物理模型时会自动产生自动递增的列。在SQL Server中会产生一个类型为numeric的自动递增列。而在Oracle中会产生一个为“S_”+"表的Name"为名称的Sequence,并且自动递增列的数据类型也为numeric。
4、一般情况下我们希望是一个自动递增列为integer类型(如上文所述,为了节省空间),但在PowerDesigner中是numeric,而在Oracle中我们不仅希望数据类型有所改变,命名也不尽如人意。我们更希望以“S_”+"表的Code"来命名(我个人的理解是表的Name是为了显示时更为直观而有的,我一般用中文命名,而Code是为了生成代码时提供的名称,我一般用英文。如有不正确的地方,还望大侠们指正)。
5、综上所述,在在Concept Data Model和Logical Data Model中最好不要用自动递增类型,自动递增类型可以在物理模型中更为人性化的生成,但在不同的数据库中工作量是不同的,这也是个很大的问题。
再就是我一直很疑惑,这样一个完美的软件就没有考虑过这几个问题吗?还是哪里有设置的地方。。。。这用这个软件也是小菜,哪们大侠知道如何设置一定转告我啊,不胜感激。。。
ps:我刚才找了一下,是没有找到如何使数据类型趋势为integer,但是发现生成的Sequence是以“S_”+"表的Code"来命名的。。所以我建议生成物理模型后再来改数据类型。(有时用numeric做主键也好,虽然numeric占用的空间大,但其表示的数据范围也大啊,有大量的数据时可以考虑用numeric)(呵呵,再后来我发现其实Integer类型就是对应Numberic(32,0),所以也可以就用原来的设置就好了,呵呵。。。。)