简单BBS数据库设计.doc
KMUST JAVA论坛数据库文档KMUST JAVA BBSDBMS: ORACLE Version 10g作者:KMUST JAVA论坛开发小组成员版本:0.1时间:2011/7/19说明:KMUST JAVA论坛数据库设计文档I 数据库表关系图II 数据库表清单名称说明T_ADMIN管理员表T_ARTICLE帖子表T_AVATAR头像表T_CATEGORY论坛分类表T_FEEDBACK用户意见反馈表T_FORUM论坛版块表T_NOTICE公告表T_RESPONSE反馈应答表T_SCORE用户积分明细表T_USER用户表II.1 表格T_ADMINII.1.1 表格T_ADMIN的列清单名称注释数据类型长度主要的外来键ID管理员编号NUMBER(2)2TRUEFALSENAME管理员用户名VARCHAR2(30)30FALSEFALSEPASSWORD管理员密码VARCHAR2(30)30FALSEFALSEREGTIME管理员注册时间DATEFALSEFALSEAVATARID管理员头像编号NUMBER(3)3FALSETRUEII.1.1.1 表格T_ADMIN的触发器清单名称注释TRI_DELETE_ADMIN_INFO在删除管理员之前,修改该管理员发布的公告和应答记录,将这些记录中的管理员编号改为系统默认管理员编号TRI_DELETE_ADMIN_INFO的文本:CREATE OR REPLACE TRIGGER TRI_DELETE_ADMIN_INFO before delete on t_admin for each rowbegin update t_notice set adminid=1 where adminid=:OLD.id; update t_response set adminid=1 where adminid=:OLD.id;end;/ALTER TRIGGER TRI_DELETE_ADMIN_INFO ENABLE;II.2 表格T_ARTICLEII.2.1 表格T_ARTICLE的列清单名称注释数据类型长度主要的外来键ID帖子编号NUMBER(10)10TRUEFALSEPID父帖编号,0表示该帖子为主题帖NUMBER(10)10FALSEFALSEROOTID主题帖编号,主题帖的该字段值与其自身编号相同NUMBER(10)10FALSEFALSETITLE帖子标题VARCHAR2(255)255FALSEFALSECONTENT帖子内容CLOBFALSEFALSEPDATE发表时间DATEFALSEFALSEISLEAF是否为叶子结点(即没有被回复的帖子),0表示没有被回复,1表示被回复过NUMBER(1)1FALSEFALSEUSERID发帖用户编号NUMBER(5)5FALSETRUEFORUMID帖子所属版块NUMBER(3)3FALSETRUEII.2.1.1 表格T_ARTICLE的触发器清单名称注释TRI_ADD_DEFAULT_SCORE用户每发一个帖子,不论是主题帖还是回复帖,均为该用户加2分的积分,此时用户积分明细表中的该帖子积分记录的评价用户编号与发帖用户编号相同TRI_ADD_DEFAULT_SCORE的文本:CREATE OR REPLACE TRIGGER TRI_ADD_DEFAULT_SCORE after insert on t_article for each rowbegin insert into t_score values (:NEW.id, :NEW.userid, :NEW.userid, 2);end;/ALTER TRIGGER TRI_ADD_DEFAULT_SCORE ENABLE;TRI_DELETE_ARTICLE_SCORE删除帖子之前,同时从用户积分明细表中删除有关该帖子的积分记录TRI_DELETE_ARTICLE_SCORE的文本:CREATE OR REPLACE TRIGGER TRI_DELETE_ARTICLE_SCORE before delete on t_article for each rowbegin delete from t_score where articleid = :OLD.id;end;/ALTER TRIGGER TRI_DELETE_ARTICLE_SCORE ENABLE;TRI_UPDATE_ISLEAF_ROOTID发帖之前,如果该帖是主题贴,则将其rootid置为该帖子的id,如果是回复帖,由将被回复的帖子的isleaf字段置为1,表示非叶子结果(被回复过的帖子)TRI_UPDATE_ISLEAF_ROOTID的文本:CREATE OR REPLACE TRIGGER TRI_UPDATE_ISLEAF_ROOTID before insert on t_article for each rowdeclare tid t_article.id%type;begin if(:NEW.pid = 0) then tid := :NEW.id; :NEW.rootid := tid; else update t_article set isleaf = 1 where id = :NEW.pid; end if;end;/ALTER TRIGGER TRI_UPDATE_ISLEAF_ROOTID ENABLE;II.3 表格T_AVATARII.3.1 表格T_AVATAR的列清单名称注释数据类型长度主要的外来键ID头像编号NUMBER(3)3TRUEFALSEIMAGE头像图片BLOBFALSEFALSEII.4 表格T_CATEGORYII.4.1 表格T_CATEGORY的列清单名称注释数据类型长度主要的外来键ID分类编号NUMBER(3)3TRUEFALSETITLE分类标题VARCHAR2(50)50FALSEFALSEII.5 表格T_FEEDBACKII.5.1 表格T_FEEDBACK的列清单名称注释数据类型长度主要的外来键ID意见编号NUMBER(5)5TRUEFALSEUSERID发表意见的用户编号NUMBER(5)5FALSETRUEPDATE意见发表时间DATEFALSEFALSETITLE意见标题VARCHAR2(50)50FALSEFALSECONTENT意见内容VARCHAR2(2000)2000FALSEFALSEISSOLVED是否已回复,初始值为0,表示未回复,1表示已回复NUMBER(1)1FALSEFALSEII.5.1.1 表格T_FEEDBACK的触发器清单名称注释TRI_DELETE_RESPONSE在删除用户意见之前,先将反馈应答表中回复该意见的记录删除,以避免外键约束影响TRI_DELETE_RESPONSE的文本:CREATE OR REPLACE TRIGGER TRI_DELETE_RESPONSE before delete on t_feedback for each rowbegin delete from t_response where feedbackid = :OLD.id;end;/ALTER TRIGGER TRI_DELETE_RESPONSE ENABLE;II.6 表格T_FORUMII.6.1 表格T_FORUM的列清单名称注释数据类型长度主要的外来键ID版块编号NUMBER(3)3TRUEFALSETITLE版块名称VARCHAR2(50)50FALSEFALSEDESCRIPTION版块描述VARCHAR2(200)200FALSEFALSECATEGORYID所属分类的编号NUMBER(3)3FALSETRUEII.7 表格T_NOTICEII.7.1 表格T_NOTICE的列清单名称注释数据类型长度主要的外来键ID公告编号NUMBER(5)5TRUEFALSETITLE公告标题VARCHAR2(50)50FALSEFALSECONTENT公告内容VARCHAR2(2000)2000FALSEFALSEPDATE公告发布时间DATEFALSEFALSEADMINID发布公告的管理员编号NUMBER(2)2FALSETRUEII.8 表格T_RESPONSEII.8.1 表格T_RESPONSE的列清单名称注释数据类型长度主要的外来键ID反馈应答编号NUMBER(5)5TRUEFALSEFEEDBACKID被回复意见的编号NUMBER(5)5FALSETRUEPDATE回复时间DATEFALSEFALSETITLE回复标题VARCHAR2(50)50FALSEFALSECONTENT回复内容VARCHAR2(2000)2000FALSEFALSEADMINID回复管理员编号NUMBER(2)2FALSETRUEII.8.1.1 表格T_RESPONSE的触发器清单名称注释TRI_UPDATE_FEEDBACK_STATUS当反馈应答表中插入新的回复之后,将对应的用户意见表中记录的issolved字段置为1,表示已经回复TRI_UPDATE_FEEDBACK_STATUS的文本:CREATE OR REPLACE TRIGGER TRI_UPDATE_FEEDBACK_STATUS after insert on t_response for each rowdeclare f_status t_feedback.issolved%type;begin select issolved into f_status from t_feedback where id = :NEW.feedbackid; if(f_status=0) then update t_feedback set issolved=1 where id = :NEW.feedbackid; end if;end;/ALTER TRIGGER TRI_UPDATE_FEEDBACK_STATUS ENABLE;II.9 表格T_SCOREII.9.1 表格T_SCORE的列清单名称注释数据类型长度主要的外来键ARTICLEID帖子编号NUMBER(10)10FALSETRUEPUSER发帖用户编号NUMBER(5)5FALSETRUEVUSER评价用户编号NUMBER(5)5FALSETRUESCORE评价得分NUMBER(2)2FALSEFALSEII.10 表格T_USERII.10.1 表格T_USER的列清单名称注释数据类型长度主要的外来键ID用户编号NUMBER(5)5TRUEFALSENAME用户名VARCHAR2(30)30FALSEFALSEEMAILEmailVARCHAR2(50)50FALSEFALSEPASSWORD密码VARCHAR2(30)30FALSEFALSEREGTIME注册时间DATEFALSEFALSEADDRESS来自何地VARCHAR2(100)100FALSEFALSEQQQQ号VARCHAR2(20)20FALSEFALSEPROFESSION职业VARCHAR2(20)20FALSEFALSESIGNATURE签名,将会显示在该用户发表的帖子内容的下方VARCHAR2(100)100FALSEFALSEAVATARID头像编号NUMBER(3)3FALSETRUEUSABLE是否可用,1表示可用,0表示不可用NUMBER(1)1FALSEFALSEIII 序列清单名称注释S_ADMIN管理员表中id字段的引用值S_ARTICLE帖子表中id字段的引用值S_CATEGORY论坛分类表中id字段的引用值S_FEEDBACK用户意见表中id字段的引用值S_FORUM论坛版块表中id字段的引用值S_NOTICE公告表中id字段的引用值S_RESPONSE反馈应答表中id字段的引用值S_USER用户表中id字段的引用值III.1 序列S_ADMIN的文本CREATE SEQUENCE S_ADMINNOMAXVALUEINCREMENT BY 1START WITH 1NOCACHENOORDERNOCYCLE ;III.2 序列S_ARTICLE的文本CREATE SEQUENCE S_ARTICLENOMAXVALUEINCREMENT BY 1START WITH 1NOCACHENOORDERNOCYCLE ;III.3 序列S_CATEGORY的文本CREATE SEQUENCE S_CATEGORYNOMAXVALUEINCREMENT BY 1START WITH 1NOCACHENOORDERNOCYCLE ;III.4 序列S_FEEDBACK的文本CREATE SEQUENCE S_FEEDBACKNOMAXVALUEINCREMENT BY 1START WITH 1NOCACHENOORDERNOCYCLE ;III.5 序列S_FORUM的文本CREATE SEQUENCE S_FORUMNOMAXVALUEINCREMENT BY 1START WITH 1NOCACHENOORDERNOCYCLE ;III.6 序列S_NOTICE的文本CREATE SEQUENCE S_NOTICENOMAXVALUEINCREMENT BY 1START WITH 1NOCACHENOORDERNOCYCLE ;III.7 序列S_RESPONSE的文本CREATE SEQUENCE S_RESPONSENOMAXVALUEINCREMENT BY 1START WITH 1NOCACHENOORDERNOCYCLE ;III.8 序列S_USER的文本CREATE SEQUENCE S_USERNOMAXVALUEINCREMENT BY 1START WITH 1NOCACHENOORDERNOCYCLE ;IV 目录清单名称注释D_IMAGES头像文件存储的路径IV.1 目录P_IMAGES的文本- Create directory create or replace directory D_IMAGES as 'C:avatar'V 存储过程清单名称注释P_IMG_INSERT存储过程P_IMG_INSERT用来将用户头像(图片)插入到数据库中V.1 存储过程P_IMG_INSERT的文本CREATE OR REPLACE PROCEDURE P_IMG_INSERT( tid t_avatar.id%type, filename varchar2)isf_lob bfile;b_lob blob;begin insert into t_avatar (id, image) values (tid, empty_blob() return image into b_lob; f_lob:=bfilename('D_IMAGES', filename); dbms_lob.fileopen(f_lob, dbms_lob.FILE_READONLY); dbms_lob.loadfromfile(b_lob, f_lob, dbms_lob.getlength(f_lob); dbms_lob.fileclose(f_lob); commit;end;/