最近要做一个系统,现在要设计数据库中的字段,字段大致如下:用户名(唯一性主键)、密码、密码问题、密码答案、姓名、性别、年龄、身高、家乡、大学、入学年份。
  现在要设计表,不知道该怎么设计,是设计成一张表还是多张表?自己感觉如果设计成一张表,表中字段比较多,不过好像没违反三范式;如果设计成两张表,两表的主键又好像都是用户名,是一样的。所以不知道该怎么设计?大家帮帮忙!!在下先感谢了!!

解决方案 »

  1.   

    用户名一般不应设为主键,一般应设置一个用户编号(ID)
    单从字段来说,远不算多
    可以做成两张表的
    用户密码表(用户ID(唯一性主键)、密码、密码问题、密码答案)
    用户基本信息表(用户ID(唯一性主键)、姓名、性别、年龄、身高、家乡、大学、入学年份)
      

  2.   

    那我的用户名要求是唯一的,因为在注册时要使用Ajax进行唯一性验证。
    是不是设置一个用户编号,int类型,让其自动递增,然后用户名(就是起的一昵称)也加入其中,这样可以吗?
      

  3.   

    /*==============================================================*/
    /* Table: PASSWORD_QUESTION                                     */
    /*==============================================================*/
    create table PASSWORD_QUESTION  (
       ID                   INT                             not null,
       QUESTION             VARCHAR(30)                     not null,
       constraint PK_PASSWORD_QUESTION primary key (ID)
    );comment on table PASSWORD_QUESTION is
    '密码保护问题';/*==============================================================*/
    /* Table: USER_INFO                                             */
    /*==============================================================*/
    create table USER_INFO  (
       USERNAME             VARCHAR(10)                     not null,
       NAME                 VARCHAR(20),
       SEX                  CHAR(2),
       BIRTHDAY             DATE,
       HEIGHT               DECIMAL(4, 1),
       HOME                 VARCHAR(40),
       COLLEAGE             VARCHAR(30),
       SCHOOL_DAY           INT,
       constraint PK_USER_INFO primary key (USERNAME)
    );comment on table USER_INFO is
    '这是用户基本信息表';/*==============================================================*/
    /* Table: USER_LOGIN                                            */
    /*==============================================================*/
    create table USER_LOGIN  (
       USERNAME             VARCHAR(10)                     not null,
       PASSWORD             VARCHAR(16)                     not null,
       PRO_QUESTION         INT,
       PRO_ANSWER           VARCHAR(40),
       constraint PK_USER_LOGIN primary key (USERNAME)
    );comment on table USER_LOGIN is
    '这是用户注册表';//'用户信息表'中的username参照'用户注册表'
    alter table USER_INFO
       add constraint FK_USER_INF_R1_USER_LOG foreign key (USERNAME)
          references USER_LOGIN (USERNAME);
    //'用户注册表'中的密保问题——参照'密保问题表'
    alter table USER_LOGIN
       add constraint FK_USER_LOG_R2_PASSWORD foreign key (PRO_QUESTION)
          references PASSWORD_QUESTION (ID);大家看看我的设计合理不?