贴吧类网站数据库建表自析

Posted xiedacon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了贴吧类网站数据库建表自析相关的知识,希望对你有一定的参考价值。

最近想自己做一个贴吧类的网站,就向百度贴吧学习学习吧。

功能分析:

1、进入主页显示吧中最新的帖子信息
2、未登录时,能看帖,但不能发帖跟回帖
3、登陆后,显示用户相关信息,能发帖跟回帖
4、吧务能对帖子进行管理,也能管理用户

帖子方面:发帖、查帖、回帖、删帖、加精、置顶
用户方面:登陆、注册、管理(禁言)

相关类分析:

1、初步分析

    User         用户
    uid          id
    username     账号
    password     密码
    name         昵称
    icon         头像
    email        邮箱
    identity     吧中身份
    level        等级
    privilege    具有的权限

    Post         帖子
    pid          id
    title        帖子名称
    content      内容概述
    num          回帖数
    owner        楼主(many to one)
    lastUser     最后回帖人(many to one)
    ldate        最后回帖时间
    floors       帖子所有楼层(one to many)
    status       帖子状态

    Floor        楼层
    fid          id
    owner        层主(many to one)       
    content      内容
    date         回帖时间
    floorNum     是几楼
    post         所属帖子(many to one)
    replies      楼层所有回复(one to many)

    Reply        回复
    rid          id
    owner        回复人(many to one)
    content      内容
    date         回复时间
    floor        所属楼层(many to one

身份:

每个用户的身份都有可能会发生改变,以后也有可能会出现新的身份,所以需要将身份独立作为一个表。

等级:

百度贴吧后台有对等级的称号修改的功能,所以将等级独立作为一个表。

权限:

权限是跟身份挂钩的,等级可能也会有影响,所以将权限从用户中分离出来,通过身份和等级获取。
但是权限本身只有那么几种,以后出现新权限的概率也不大。
因此可以在项目启动时,用PrivilegeFactory类把权限对象写入内存,然后根据身份和等级为用户注入相应的权限。

一个用户也可以拥有多个权限,比如发帖、删帖。可以把权限对应成二进制数

怎么让权限看起来像权限?
思考:
可以将类中的权限交给一个类管理
给用户类注入的不是Privilege而是一个PrivilegeManage。PrivilegeManager是单例的,可以节省内存

public class PrivilegeManager
    private ThreadLocal privilegeTL = new ThreadLocal();

    private Map<String,Privilege> getPrivilegeMap()
        return privilegeTL.get();
    

    public Privilege getPrivilege(String pname)
        return getPrivilegeMap().get(pname);
    

    public void setPrivilegeMap(Map<String,Privilege> privilegeMap)
        privilegeTL.set(privilegeMap);
    


privilegeMap中的结构

    "权限1":AddPostPrivilege,
    "权限2":DeletePostPrivilege,
    "权限3":DefaultPrivilege


权限相关类和接口的设计
public interface Privilege
    boolean isAllow();

public interface AddPostPrivilege
    private Integer pid;
    private String pname;
    public boolean isAllow()
        return true;
    
    //get,set

public interface DefaultPrivilege
    public boolean isAllow()
        return true;
    


到这就差不多设计完成了,但是发现由于Privilege接口实在是太简单,完全可以使用boolean值代替。

状态:

跟身份和等级一样可以独立作为一个表

2、深入分析

修改后的用户:
    User         用户
    uid          id
    username     账号
    password     密码
    name         昵称
    icon         头像
    email        邮箱
    identity     吧中身份(many to one)
    level        等级(many to one)
    privilegeManager   权限管理器
新增:
    Identity     身份
    iid          id
    iname        身份名称(普通用户/会员/吧主)
    privileges   身份对应的权限

    Level        等级
    lid          id
    lname        等级对应称号

    Priviledge   权限
    pid          id
    pname        权限名称
    classname    权限对应的类全名,暂时可有可无吧

    status       状态
    sid          id
    sname        状态名称

将类关系变成表关系

User       类型       user       类型            
uid        Integer   uid        int(11)        主键
username   String    username   varchar(255)
password   String    password   varchar(255)
name       String    name       varchar(255)
icon       Image     icon       varchar(255)   保存的是路径 
email      String    email      varchar(255)
identity   Identity  iid        int(11)        外键
level      Level     lid        int(11)        外键
privilegeManager
Post       类型       post       类型
pid        Integer   pid        int(11)        主键
title      String    title      varchar(255)    
content    String    content    varchar(255) 
num        Integer   num        int(11)        
owner      User      ouid       int(11)        外键
lastUser   User      luid       int(11)        外键
ldate      Date      ldate      datetime
status     Status    sid        int(11)        外键
floors
Floor      类型       floor      类型
fid        Integer   fid        int(11)        主键
owner      User      uid        int(11)        外键
content    String    content    varchar(255)
date       Date      date       datetime
floorNum   Integer   floorNum   int(11)
post       Post      pid        int(11)        外键
replies    
Reply      类型       reply      类型
rid        Integer   rid        int(11)        主键
owner      User      uid        int(11)        外键
content    String    content    varchar(255)
date       Date      date       datetime
floor      Post      fid        int(11)        外键
Identity    类型       identity    类型
iid         Integer   iid         int(11)      主键
iname       String    iname       varchar(255)   
privileges  Integer   privileges int(11)       交给PrivilegeFactory解析后,将得到的PrivilegeManager注入User中
Level       类型       level       类型
lid         Integer   lid         int(11)      主键
lname       String    lname       varchar(255)
Privilege   类型       privilege   类型
pid         Integer   pid         int(11)      主键
pname       String    pname       varchar(255)
classname   String    classname   varchar(255)
Status      类型       status      类型
sid         Integer   sid         int(11)      主键
sname       String    sname       varchar(255)

以上是关于贴吧类网站数据库建表自析的主要内容,如果未能解决你的问题,请参考以下文章

python 爬虫第二例--百度贴吧

sql server 数据库 设置id 自增

mysql数据库cmd命令窗建表时有时候出错按回车一直换行不执行,也不报错,无法退出,如何解决?

ABAP中,用Ranges定义的内表,由于数据量大导致运行错误

使用样式表自定义 QDial

电商网站常用的楼层导航效果