create table STYLE
(
   SP_STYLE_ID          INTEGER                not null,
   CODE                 VARCHAR(20)            not null,
   NAME_ENGLISH         VARCHAR(100)           not null,
   NAME_CHINESE         VARCHAR(300),
   SP_VALID_STATUS_ID   SMALLINT               not null,
   DELETE_FLAG          CHARACTER              not null with default 'Y',
   CREATOR              INTEGER                not null,
   CREATE_DATE          TIMESTAMP              not null,
   MODIFIER             INTEGER,
   MODIFY_DATE          TIMESTAMP,
   CUSTOMER_ID          INTEGER,
   CUSTOMER_STYLE_NO    VARCHAR(50),
   SHORT_NAME           VARCHAR(100),
   SP_GAUGE_ID          SMALLINT               not null,
   SP_GARMENT_ID        SMALLINT,
   YARN_PL_MR_CREATED   CHARACTER              not null with default 'N',
   constraint SP_STYLE_PK primary key (CODE),
   constraint SP_STYLE_IDX0 unique (SP_STYLE_ID)
)
这样的数据库表:code是主键,SP_STYLE_ID唯一性约束(数据库中的表都是这样设计的)
问题一:不知道这样设计有什么好处,我觉得有一个ID就足够了,请高人指点。
表与表之间的外键都是唯一性约束,就像SP_STYLE_ID用来做别的表的外键
问题二:通常都是用表的ID(主键)作为外键来用,而这里的外键不是主键而是唯一约束,这样有何利弊?
在开发中遇到很多问题,就拿对数据库的操作而言:如果用ORM框架来操作数据库那真让人头疼
问题三:不知道这样的数据库该怎么开发,我们是都用做原始的sql语句来呢,还是用什么orm框架来?
请高人给点建议,数据库是有了,这是最难办的事。 

解决方案 »

  1.   

    感觉设计反了,
    应当是SP_STYLE_ID是PK,CODE unique言归正传,之所以有两个唯一的字段,主要是因为:CODE是业务相关的,“可能”被修改,当然,在修改时需要保证不重复。而ID是业务无关的,只代表某条记录的“物理”位置,无论业务今后怎么修改,只要这张表还在,用这个ID就能找到这条记录。比如,一个管理全国人口的数据库,A表存放的是个人信息,B表存放的是每个人的犯罪记录。一对多关系。
    可能有人想当然按照身份证做主键。身份证固然不会重复。但是,当身份证可能换代,假设使用了身份证,就需要把所有A表的主键以及B表中的引用字段进行更新,工作量浩大,而且易错。而使用ID(自增长,或者通过sequence或其他方式取得)就不会由此问题。
      

  2.   

    但是A表以外的B、C、D、E、F...相关字段无需更新
      

  3.   

    说得好,既然CODE是与业务相关的,就做好不要做主键,用ID做主键让系统自动生成。在修改CODE是完全可以做到CODE不重复,可以用ajax判断,重复不让输入。这样什么问题都解决了。
    不知道仁兄对这样的数据库怎么样改造?在保证数据不重复的前提下,让我们对数据库有更好的操作,特别是ORM操作。请指点。