最代码的数据库设计结合了javaniu的经验,将所有主业务表设计为project表,所有业务都由该表来体现,通过字段type来区别是什么业务,对于业务间高度相同的属性就加到project表中,对于某个业务特有的属性则通过extend_json字段来表达,该这段是json字符串的,可以随意定义。project的表结构如下:
CREATE TABLE `zuidaima_project` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`create_time` datetime NOT NULL,
`update_time` datetime DEFAULT NULL,
`user_id` bigint(20) NOT NULL,
`type` int(11) NOT NULL DEFAULT '0' COMMENT '1寻求代码\r\n2分享代码\r\n3发起活动\r\n4活动日志\r\n5分享经验\r\n6发表博客',
`title` varchar(1000) NOT NULL,
`content` longtext NOT NULL,
`status` int(2) NOT NULL COMMENT '-1删除\r\n0待审核\r\n2正常\r\n11寻求中31活动中',
`extend_json` varchar(2000) DEFAULT '' COMMENT '扩展信息json,如寻求的代码数,浏览数,评论数,来源',
`topics` varchar(500) NOT NULL DEFAULT '' COMMENT '所属话题json,如[{id:1},{id:2}]',
`source_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '活动日志则为活动id',
`first_sort` int(11) NOT NULL DEFAULT '0',
`second_sort` int(11) NOT NULL DEFAULT '0',
`third_sort` int(11) NOT NULL DEFAULT '0',
`publish_time` datetime DEFAULT NULL,
`from_url` varchar(500) DEFAULT NULL,
`uuid` bigint(20) NOT NULL,
`tags` varchar(500) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2860 DEFAULT CHARSET=utf8
对于以后数据量大的问题,完全可以通过拆库拆表来做到,所以不用担心这个问题,这样在java mvc层实现代码就很简单了
拆表 拆库
拆表就是将一张表复制N多张,里面分别存放不用内容的数据,数据的存放是用HASH算法来决定放入哪张表。
例如用户表user,传统情况就是一张表,拆表就是将表复制为user_01,user_02等里面都存放了格式一样的不同用户数据。
拆库和拆表类似,就是库的复制。
拆表或拆库有很多的HASH算法,主要目的就是减少表的数据量,用算法保证每个表的数据量平均,请求,读写操作被分摊降低压力,而且安全,出了问题最多是一部分用户受影响。缺点就是检索不方便,需要另想办法。
为了能将最代码整站用户的操作都展现出来,需要设计一种动态类型,既可以根据业务无限扩展,也可以指定某些用户行为是可以产生多少牛币交换的,这样就在原先javaniu的零散的表设计基础上抽象出event表
最代码网站中关于动态表event的设计思路
为了能将最代码整站用户的操作都展现出来,需要设计一种动态类型,既可以根据业务无限扩展,也可以指定某些用户行为是可以产生多少牛币交换的,这样就在原先javaniu的零散的表设计基础上抽象出event表
表结构如下:
01
|
CREATE TABLE `javaniu_event` (
|
02
|
`id` bigint(20) unsigned NOT NULL auto_increment,
|
03
|
`create_time` datetime NOT NULL,
|
04
|
`update_time` datetime default NULL,
|
05
|
`event_rule_id` bigint(20) NOT NULL default '0' COMMENT '用户注册\r\n下载代码\r\n浏览分享\r\n浏览寻求\r\n收藏分享\r\n收藏寻求\r\n浏览活动\r\n追加悬赏\r\n加入活动\r\n拜师\r\n关注用户\r\n发表心情\r\n发表寻求\r\n评论寻求\r\n评论代码\r\n上传代码\r\n下载代码\r\n分享代码\r\n关注用户\r\n浏览分享\r\n浏览寻求\r\n管理员删除代码\r\n收藏分享\r\n收藏寻求\r\n获取勋章\r\n拜师傅\r\n发起活动\r\n浏览活动\r\n加入活动\r\n追加悬赏\r\n连续一周发表心情\r\n用户周贡献排行\r\n用户月贡献排行\r\n用户年贡献排行\r\n代码下载周排行\r\n代码下载月排行\r\n代码下载年排行',
|
06
|
`user_id` bigint(20) NOT NULL default '0',
|
07
|
`source_user_id` bigint(20) NOT NULL default '0',
|
08
|
`source_id` bigint(20) NOT NULL default '0',
|
09
|
`target_id` bigint(20) NOT NULL default '0',
|
10
|
`status` int(2) NOT NULL default '0' COMMENT '-1删除0待审核2正常',
|
11
|
`type` int(2) NOT NULL default '0',
|
12
|
PRIMARY KEY (`id`),
|
13
|
KEY `create_time` (`create_time`),
|
14
|
KEY `userid_status` (`user_id`,`status`),
|
15
|
KEY `event_rule_id_source_id` (`event_rule_id`,`source_id`),
|
16
|
KEY `event_rule_id_status` (`event_rule_id`,`status`),
|
17
|
KEY `type_source_id` (`type`,`source_id`)
|
18
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8
|
关联表event_rule可以指定牛币规则及其动态显示信息,结构如下:
01
|
CREATE TABLE `javaniu_event_rule` (
|
02
|
`id` bigint(20) unsigned NOT NULL auto_increment,
|
03
|
`create_time` datetime NOT NULL,
|
04
|
`update_time` datetime default NULL,
|
05
|
`type` int(1) NOT NULL COMMENT '注册+1\r\n发表心情+1\r\n连续一周发表心情+5\r\n分享代码+1\r\n分享代码被下载+n(n为分享者者自定义牛币)\r\n寻求代码-2\r\n上传代码+1\r\n上传代码被下载+1\r\n代码被设为最佳+n(n为寻求者者自定义牛币)\r\n删除代码-1\r\n无效寻求-2\r\n无效代码-2\r\n管理员奖赏+n\r\n管理员惩罚-n\r\n周top10+5\r\n月top10+10\r\n年top10+100\r\n信息完善+1\r\n包月vip+100\r\n师傅赠送+n牛币\r\n授予徽章+5牛币\r\n',
|
06
|
`name` varchar(100) NOT NULL,
|
07
|
`niubi` int(11) NOT NULL,
|
08
|
`extend_json` varchar(1000) NOT NULL,
|
09
|
PRIMARY KEY (`id`)
|
10
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8
|
event的用户行为数据模型抽象如下:
模型一:用户a通过事件x产生动态0=user_id_a 0 0 0
a=>x=>0
模型二:用户a通过事件x产生产生用户a的数据1=user_id_a 0 0 1
a=>x=>1
模型三:用户a通过事件x对用户b的数据1产生用户a的数据2=user_id_a b 1 2
a=>x+b+1=>2
模型四:用户a通过事件x对用户b的数据1产生动态0=user_id_a b 1 0
a=>x+b+1=>0
模型五:用户a通过事件x对用户b产生动态0=user_id_a b 0 0
a=>x+b=>0
排列组合:
user_id source_user_id source_id target_id
user_id
user_id source_user_id
user_id source_user_id source_id
user_id source_user_id source_id target_id
这样就囊括了所有会出现的用户event,只要在java层做业务转换即可:
-
package com.zuidaima.core.service.impl;
-
-
private void setSourceAndTarget(Event event, EventRule _eventRule) {
-
try {
-
EventRule eventRule = new EventRule();
-
eventRule.setCreateTime(_eventRule.getCreateTime());
-
eventRule.setExtendJson(_eventRule.getExtendJson());
-
eventRule.setId(_eventRule.getId());
-
eventRule.setName(_eventRule.getName());
-
eventRule.setNiubi(_eventRule.getNiubi());
-
eventRule.setType(_eventRule.getType());
-
eventRule.setUpdateTime(_eventRule.getUpdateTime());
-
BaseEntity source = null;
-
BaseEntity target = null;
-
long sourceId = event.getSourceId();
-
long targetId = event.getTargetId();
-
JSONObject extend = eventRule.getExtend();
-
extend = eventRule.getExtend();
-
String description = (String) extend.get("description");
-
String _description = null;
-
Answer answer = null;
-
Project project = null;
-
switch (eventRule.getType()) {
-
case ModuleConstants.EVENT_TYPE_RULE_PROJECT_CREATE:
-
case ModuleConstants.EVENT_TYPE_RULE_PROJECT_DELETE_BY_USER:
-
case ModuleConstants.EVENT_TYPE_RULE_PROJECT_DELETE_BY_ADMIN:
-
case ModuleConstants.EVENT_TYPE_RULE_PROJECT_VIEW:
-
case ModuleConstants.EVENT_TYPE_RULE_PROJECT_COLLECT:
-
case ModuleConstants.EVENT_TYPE_RULE_PROJECT_REWARD:
-
if (sourceId > 0) {
-
source = projectService.findOneById(sourceId);
-
}
-
if (targetId > 0) {
-
target = projectService.findOneById(targetId);
-
}
-
project = (Project) target;
-
if (source != null) {
-
project = (Project) source;
-
}
-
if (project == null) {
-
return;
-
}
-
_description = String.format(
-
description,
-
ModuleConstants.PROJECT_TYPE_DESC_MAP.get(
-
project.getType()).getDesc());
-
break;
-
case ModuleConstants.EVENT_TYPE_RULE_POST_CREATE:
-
case ModuleConstants.EVENT_TYPE_RULE_POST_DELETE_BY_USER:
-
case ModuleConstants.EVENT_TYPE_RULE_POST_DELETE_BY_ADMIN:
-
if (sourceId > 0) {
-
source = postService.findOneById(sourceId);
-
}
-
if (targetId > 0) {
-
target = postService.findOneById(targetId);
-
}
-
Post post = (Post) target;
-
if (source != null) {
-
post = (Post) source;
-
}
-
_description = String.format(description,
-
ModuleConstants.POST_TYPE_DESC_MAP.get(post.getType()));
-
break;
-
// case ModuleConstants.EVENT_TYPE_RULE_GROUP_CREATE://暂时没有这种动态
-
case ModuleConstants.EVENT_TYPE_RULE_GROUP_JOIN_IN:
-
case ModuleConstants.EVENT_TYPE_RULE_GROUP_DELETE_BY_USER:
-
// case
-
// ModuleConstants.EVENT_TYPE_RULE_GROUP_DELETE_BY_ADMIN://暂时没有这种动态
-
if (sourceId > 0) {
-
source = groupService.findOneById(sourceId);
-
}
-
if (targetId > 0) {
-
target = groupService.findOneById(targetId);
-
}
-
Group group = (Group) source;
-
-
_description = String
-
.format(description,
-
ModuleConstants.GROUP_TYPE_DESC_MAP.get(group
-
.getType()));
-
break;
-
case ModuleConstants.EVENT_TYPE_RULE_COMMENT_CREATE:
-
case ModuleConstants.EVENT_TYPE_RULE_COMMENT_DELETE_BY_USER:
-
case ModuleConstants.EVENT_TYPE_RULE_COMMENT_DELETE_BY_ADMIN:
-
target = commentService.findOneById(targetId);
-
Comment comment = (Comment) target;
-
int commentType = comment.getType();
-
if (commentType == ModuleConstants.COMMENT_TYPE_ANSWER) {
-
source = answerService.findOneById(sourceId);
-
answer = (Answer) source;
-
project = (Project) answer.getTarget();
-
_description = String.format(
-
description,
-
ModuleConstants.PROJECT_TYPE_DESC_MAP.get(
-
project.getType()).getDesc());
-
} else if (commentType == ModuleConstants.COMMENT_TYPE_PROJECT) {
-
source = projectService.findOneById(sourceId);
-
project = (Project) source;
-
_description = String.format(
-
description,
-
ModuleConstants.PROJECT_TYPE_DESC_MAP.get(
-
project.getType()).getDesc());
-
} else if (commentType == ModuleConstants.COMMENT_TYPE_POST) {
-
source = postService.findOneById(sourceId);
-
post = (Post) source;
-
_description = String.format(description,
-
ModuleConstants.POST_TYPE_DESC_MAP.get(post
-
.getType()));
-
} else {
-
-
}
-
break;
-
case ModuleConstants.EVENT_TYPE_RULE_ANSWER_CREATE:
-
case ModuleConstants.EVENT_TYPE_RULE_ANSWER_BEEN_SET_PERFECT:
-
source = projectService.findOneById(sourceId);
-
target = answerService.findOneById(targetId);
-
project = (Project) source;
-
_description = String.format(
-
description,
-
ModuleConstants.PROJECT_TYPE_DESC_MAP.get(
-
project.getType()).getDesc());
-
break;
-
case ModuleConstants.EVENT_TYPE_RULE_ANSWER_GET:
-
case ModuleConstants.EVENT_TYPE_RULE_ANSWER_DELETE_BY_USER:
-
case ModuleConstants.EVENT_TYPE_RULE_ANSWER_DELETE_BY_ADMIN:
-
source = answerService.findOneById(sourceId);
-
answer = (Answer) source;
-
Project _project = (Project) answer.getTarget();
-
_description = String.format(
-
description,
-
ModuleConstants.PROJECT_TYPE_DESC_MAP.get(
-
_project.getType()).getDesc());
-
break;
-
case ModuleConstants.EVENT_TYPE_RULE_REPUTATION_CREATE:
-
if (sourceId > 0) {
-
source = reputationService.findOneById(sourceId);
-
}
-
if (targetId > 0) {
-
target = reputationService.findOneById(targetId);
-
}
-
break;
-
case ModuleConstants.EVENT_TYPE_RULE_USER_FOLLOW:
-
source = userService.findOneById(sourceId);
-
User _user = (User) source;
-
_description = String
-
.format(description,
-
"" + _user.getName() + "");
-
break;
-
case ModuleConstants.EVENT_TYPE_RULE_MENTION_COMMENT:
-
target = commentService.findOneById(targetId);
-
comment = (Comment) target;
-
commentType = comment.getType();
-
if (commentType == ModuleConstants.COMMENT_TYPE_ANSWER) {
-
source = answerService.findOneById(sourceId);
-
answer = (Answer) source;
-
project = (Project) answer.getTarget();
-
_description = String.format(
-
description,
-
ModuleConstants.PROJECT_TYPE_DESC_MAP.get(
-
project.getType()).getDesc());
-
} else if (commentType == ModuleConstants.COMMENT_TYPE_PROJECT) {
-
source = projectService.findOneById(sourceId);
-
project = (Project) source;
-
_description = String.format(
-
description,
-
ModuleConstants.PROJECT_TYPE_DESC_MAP.get(
-
project.getType()).getDesc());
-
} else if (commentType == ModuleConstants.COMMENT_TYPE_POST) {
-
source = postService.findOneById(sourceId);
-
post = (Post) source;
-
_description = String.format(description,
-
ModuleConstants.POST_TYPE_DESC_MAP.get(post
-
.getType()));
-
} else {
-
-
}
-
break;
-
case ModuleConstants.EVENT_TYPE_RULE_MENTION_POST:
-
source = postService.findOneById(sourceId);
-
break;
-
default:
-
_description = description;
-
}
-
-
extend.put("description", _description);
-
eventRule.setExtend(extend);
-
eventRule.setExtendJson(extend.toString());
-
event.setEventRule(eventRule);
-
-
event.setSource(source);
-
event.setTarget(target);
-
} catch (Exception e) {
-
logger.error("Fail to setSourceAndTarget event:" + event);
-
}
-
}
阅读(2063) | 评论(0) | 转发(0) |