comment table 原来是只接受client的comment, 所以设计如下.CREATE TABLE comment (
comment_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
client_id INT NOT NULL,
comment_body VARCHAR(255) NOT NULL,
comment_ip VARCHAR(15) NOT NULL,
comment_timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
entry_id INT NOT NULL
);CREATE TABLE client (
client_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
client_email VARCHAR(80) NOT NULL,
client_password VARCHAR(26) NOT NULL,
client_first_name VARCHAR(50),
client_last_name VARCHAR(50),
);但现在要改成任何人都可以加comment包括client, 如果用户不是client, 需要他输入[name], [email]等数据, 这些都是client该有的.我是改动client table, 还是改动comment table, 还是有别的方法?

解决方案 »

  1.   

    我觉得要么一定要它是client才评论,不是的话要注册,
    要么加一个不是client的comment2表,不是client的comment都记在这个表里,这个comment2表可以有name和emiail字段。
    第三种办法是在comment上加多一个字段识别是client还是其他人的comment,增加name和email字段,client_id字段可以为空,但这种表比较混乱,不好管理。
      

  2.   

    谢谢XFliangwh. 因为是客户要求的, 所以你建议的第一个方案无法实行. 你说的第二种方法我想到过. 第三种方法会导致逻辑层改动过多, 可能还会有后遗症.还有就是新建一个"访问者"的表, 它就是成为没注册的表. 再在comment里加一个[访问者_id], 当一个些入一条新的comment, 也加一条"访问者"就是不知道哪个方法最科学?
      

  3.   

    create table guestusr (id int identity(-1,-1), guestname varchar(32), guestemail varchar(128))
      

  4.   

    其实关键是以后查询的问题,你这样做,以后查询就要连三个表,访问者和品论这两个表以后可能会很大的,就变了大表连client表,再连大表。
    再开一个comment表,查询时是查两次。但是有一个查询是不需要连表的,另一个也是大表连client表。结果两种情况对比就是再查多一个表还是再连一个表的比较了。我是觉得前一种比较快的。
      

  5.   

    谢谢XFliangwh.  我看看别人还有什么意见
      

  6.   

    给CLIENT表加一个字段就可以了。is_anonymous boolean not null
      

  7.   

    to yueliangdao0608是个好办法, 但这样client表里就会变的很大. 如注册客户有20000个, 但匿名用户可能会有2000000个, 不知道会不会有问题.
      

  8.   

    CREATE TABLE comment (
      comment_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
      user_id INT NOT NULL,
      comment_body VARCHAR(255) NOT NULL,
      comment_ip VARCHAR(15) NOT NULL,
      comment_timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
      entry_id INT NOT NULL
    );
    CREATE TABLE user (
      user_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
      is_anonymous boolean not null,
      user_email VARCHAR(80) NOT NULL,
      user_first_name VARCHAR(50),
      user_last_name VARCHAR(50)
    );
    CREATE TABLE client (
      client_id INT UNSIGNED PRIMARY KEY ,
      client_password VARCHAR(26) NOT NULL,
      /* and other attributes..*/
      FOREIGN KEY (client_id) REFERENCES user (user_id)
    ); 
      

  9.   

    to TIme Space:这么做有什么特别的用意吗?
      

  10.   

    user 表里存了访客和注册用户的公共基本信息。如果是注册用户(client),通过is_anonymous判断,到client表找其client扩展信息。如果要直接看client,通过 select * from client, user where client_id=user_id; 即可。
    前台设计的时候。评论隶属于一个user,与user的性质无关。这样利用前台开发时的oo设计。
      

  11.   

    用MERGE或者分区。数据大的时候。建议都看看。