图片 3

有关站内信的数据库设计,开发进阶篇系列

站内信:网站运营人员可以向单个(单发)或多个(群发)用户推送消息,站内信其实就是向数据库中插入一条条记录。

一. 列常用操作


添加新的一列test_column,并将其作为主键,FIRST将其放在表中第一行,auto_increement是自动增长

alter table test_table add column test_column int not null auto_increment FIRST add primary key(test_column);
  • 1

 

可以使用SQL语句“alter table ai3 add id0 int  auto_increment primary key
first;”来添加主键列。可以使用SQL语句“alter table ai4 modify id int
auto_increment primary key;”来修改主键列。

② 删除列

 

alter table test_table drop column test_column;
  • 1

③ 修改某一列的字段长度(例如本来是30字节改为50字节长)

alter table test_table modify column test_column varchar(50);
  • 1

④ 完全修改某一列(假设原本列名是test1_column,类型是int)

alter table test_table change column test1_column test_column varchar(30);
  • 1


仅仅想重命名某一列(首先需要了解这一列的类型,假如原本是int且不为空,列名是error_name_column)

alter table test_table change column error_name_column test_column int not null;
  • 1
  1. innodb
    行锁是基于索引实现的,如果不通过索引访问数据,innodb会使用表锁。

数据库设计:

message【站内信发件箱表】{每次运营人员发送一条站内信(无论是单发或是群发)就会在发件箱表中添加一条记录}

 图片 1

 表字段:ID、SendID、RecID、MessageID、Statue、DateTime

messagetext【站内信发件内容表】{每次运营人员发送站内信的内容就会保存到站内信发件内容表中}

图片 2

表字段:ID、Title、Message、PData

messageuserinfo【站内信接收箱表】{用户站内信收件箱}

图片 3

表字段:ID、SendID、RecID、MessageID、Statue、DateTime

 

二. 针对表的多数操作

① 修改指定表的存储引擎,假设原本是MYISAM

alter table test_table engine=innodb;
  • 1

② 删除指定表的主键

alter table test_table drop primary key;
  • 1

这里有个情况需要指出,如果该主键列是自动增长(auto_increment)的,因为mysql要求自动增长列必须是索引,所以删除主键也就删除了主键索引,这是不符合mysql要求的,是无法实现的,会报错,必须先删除自动增长(通过修改列属性),后删除主键

③ 为指定表添加主键

alter table test_table add primary key(test_column);
  • 1

④ 为指定表添加索引(普通索引),test_index是索引名

alter table test_table add index test_index(test_column);
  • 1

⑤ 删除指定表索引

alter table test_table drop index test_index;
  • 1

⑥ 重命名表

alter table test_table rename new_name_table;

 

 



 

 

如果想在一个已经建好的表中添加一列,可以用诸如:

alter table TABLE_NAME add column NEW_COLUMN_NAME varchar(20) not
null;

这条语句会向已有的表中加入新的一列,这一列在表的最后一列位置。如果我们希望添加在指定的一列,可以用:

alter table TABLE_NAME add column NEW_COLUMN_NAME varchar(20) not
null after COLUMN_NAME;

注意,上面这个命令的意思是说添加新列到某一列后面。如果想添加到第一列的话,可以用:

alter table TABLE_NAME add column NEW_COLUMN_NAME varchar(20) not
null first;

 
   http://www.cnblogs.com/MrHSR/p/9376086.html

业务逻辑:在运营人员发送了一条站内信后,当用户再次登录时就会刷新历史站内信,而那些不活跃的用户就不会更新站内信。

场景:运营人员向某个(单发)或多个(群发)用户发送站内信

添加发件内容:向messagetext站内信发件内容表中添加一条内容记录
{这里先添加messagetext站内信发件内容表产生一条记录,后面message站内信发件箱表中才有MessageID可以关联}

添加发件人发件记录:向message站内信发件箱表中添加一条发送记录
{备注:如果是单发RecID则是指定用户的UserID,如果是群发RecID则是0。(0表示所有用户)}

用户登录时刷新与自己有关的站内信,并将数据添加到messageuserinfo站内信接收箱表

  1. 查询条件:【发件人不是自己】并且【收件人是自己或者收件人是所有人】并且【自己收件表中不存在的记录】

    select m.id from Message as m where (m.recid='所有人' or m.recid='自己的ID') and m.sendid!='自己的ID' and m.MessageID not in (select u.messageid from MessageUserInfo as u  where u.recid='自己的ID')
    

      

  2. 将相关的站内信消息添加到自己的收件表中,并标记未读。

    1.   将上面【查询条件】中查询出来的id信息用做查询message站内信发件箱表的条件

      select * from message  where id=上面的m.id
      

        

    2. 将获取到message站内信发件箱表数据添加到messageuserinfo站内信接收箱表

  3. 查询出自己的站内信记录

    select u.ID,u.RecID,m.Title,m.Message,u.Statue,m.PDate from messageuserinfo as u join messagetext as m on u.MessageID = m.ID where u.RecID='自己的ID'
    

      

     

 2. Innodb 间隙锁(Next-key)机制,以及innodb使用间隙锁的原因

  http://www.cnblogs.com/MrHSR/p/9390350.html

 3.不同隔离级别下,innodb的锁机制和一致性读策略不同。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

标签:
网站地图xml地图