论坛的数据库分析与设计
❗❗❗本文最后更新于 401 天前,其中的信息可能已经过时;如有错误请在文章下方评论✅,欢迎纠错🥰!

业务分析与描述

网络缩小了我们的世界,其发展的迅速带动了人与人的交流,于是像论坛这种交流平台应运而生。然而,网络的应用是离不开底层的数据库支持的,一个良好的数据库系统是网络高效运行的前提。一个专业、针对型高校论坛(RFZF Learing-更具针对性的高校家园),因此为RFZF论坛重新设计一个数据库,对本论坛进行数据存储并进行分析。

数据库概念结构设计

ER图

 

数据库逻辑结构设计

转换规则

用户(用户编号用户账户名,用户密码,用户身份,用户性别,用户年龄,用户昵称,用户邮箱用户手机号,用户IP地址,用户等级,会员等级,用户收藏,用户文章数量,用户余额,注册时间,注销时间)

文章(文章编号,文章名,文章字数,文章作者,标签名,所属分类,最后更新时间)

分类(分类编号,分类名,分类包含文章数量,父级分类)

评论(评论编号,评论内容,评论用户,评论时间,评论文章编号,评论回复)

页面(页面编号页面名称,创建用户,包含字数,父级页面,最后更新时间)

标签(标签编号标签名,引用文章)

发送邮件(邮件编号,邮件主题,邮件内容,收件人邮箱,发送时间)

订单(订单编号,用户昵称,订单时间,订单状态)

订单明细(订单编号商品编号,商品数量,单价,折扣)

商品(商品编号,商品名称,供应商编号,单价,库存)

供应商(供应商编号,用户身份,用户账户名)

数据库表设计

描述

表名:User;该表用于存储有关用户的一切信息,实现对用户信息的增删改等管理。

表名:Posts;该表用于存储论坛内文章的信息。

表名:Category;该表用于存储网页的分类。

表名:Comments;该表用于存储网站内用户的评论信息。

表名:Pages;该表用于存储论坛网站的页面信息。

表名:Tags;该表用于存储论坛文章的标签信息。

表名:Smtp;该表用于存储网站发送至用户的邮件信息。

表名:Orders;该表用于存储论坛的订单信息。

表名:OrderDetails;该表用于存储论坛的订单明细。详细记录一个订单如果购买多个商品,则会针对性记录商品名、商品单价、折扣等信息。

表名:Products;用来存储论坛的CB库存、付费文章、源码等信息。

表名:Suppliers:用来存储供应商的信息。

表结构

User(用户表)

数据定义语言:

CREATE TABLE `User`  (
  `uNo` int(255) NOT NULL AUTO_INCREMENT COMMENT '用户编号',
  `uAc` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户账户',
  `uPw` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户密码',
  `uId` varchar(6) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户身份',
  `uSex` enum('男','女') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '男' COMMENT '用户性别',
  `uAge` int(255) UNSIGNED NOT NULL COMMENT '用户年龄',
  `uName` varchar(25) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '账户已注销' COMMENT '用户昵称',
  `uEmail` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户邮箱',
  `uPhone` int(11) UNSIGNED NOT NULL COMMENT '用户手机号',
  `uIp` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户IP地址',
  `uLevel` int(255) UNSIGNED NULL DEFAULT NULL COMMENT '用户等级',
  `uVip` enum('普通会员','N会员','R会员') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '普通会员' COMMENT '会员等级',
  `uCol` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '用户收藏',
  `uPostQt` int(255) NULL DEFAULT NULL COMMENT '用户文章数量',
  `uBanlance` decimal(16, 2) UNSIGNED NULL DEFAULT NULL COMMENT '用户余额',
  `rTime` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '注册时间',
  `Ltime` datetime NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '注销时间',
  PRIMARY KEY (`uNo`) USING BTREE,
  UNIQUE INDEX `用户账户名`(`uAc`) USING BTREE,
  UNIQUE INDEX `用户手机号`(`uPhone`) USING BTREE,
  UNIQUE INDEX `用户邮箱`(`uEmail`) USING BTREE,
  INDEX `uName`(`uName`) USING BTREE,
  INDEX `uId`(`uId`) USING BTREE
)
序号字段名类型含义备注
1uNoint(255)用户编号主键,自增
2uAcvarchar(12)用户账户名非空,唯一
3uPwvarchar(128)用户密码非空
4uIdvarchar(6)用户身份非空
5uSexenum(“男”,”女”)用户性别默认为男,非空
6uAgeint(255),unsigned用户年龄非空
7uNamevarchar(25)用户昵称默认为账户已注销,非空
8uEmailvarchar(255)用户邮箱非空,唯一
9uPhoneint(11),unsigned用户手机号非空,唯一
10uIpvarchar(255)用户IP地址
11uLevelint(255),unsigned用户等级
12uVipenum(“普通会员”,”N会员”,”R会员”)会员等级默认为普通会员,非空
13uColtext用户收藏
14uPostint(255)用户文章数量
15uBanlancedecimal(16,2),unsigned用户余额
16rTimedatetime注册时间非空
17LTimedatetime注销时间

Posts(文章表):

数据定义语言:

CREATE TABLE `Posts`  (
  `pNo` int(255) NOT NULL AUTO_INCREMENT COMMENT '文章编号',
  `pName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '文章名',
  `uName` varchar(25) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文章作者',
  `pNow` bigint(255) NOT NULL COMMENT '文章字数',
  `tName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '标签名',
  `cName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '所属分类',
  `lastTime` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
  PRIMARY KEY (`pNo`) USING BTREE,
  INDEX `所属分类`(`cName`) USING BTREE,
  INDEX `标签名`(`tName`) USING BTREE,
  INDEX `文章作者`(`uName`) USING BTREE,
  CONSTRAINT `所属分类` FOREIGN KEY (`cName`) REFERENCES `Category` (`cName`) ON DELETE SET NULL ON UPDATE SET NULL,
  CONSTRAINT `文章作者` FOREIGN KEY (`uName`) REFERENCES `User` (`uName`) ON DELETE SET NULL ON UPDATE SET NULL,
  CONSTRAINT `标签名` FOREIGN KEY (`tName`) REFERENCES `Tags` (`tName`) ON DELETE SET NULL ON UPDATE SET NULL
)
序号字段名类型含义备注
1pNoint(255)文章编号主键,自增
2pNamevarchar(255)文章名非空
3uNamevarchar(255)文章作者外键,参照User(uName),级联删除SET NULL,级联更新SET NULL
4pNowbigint(255)文章字数非空
5tNamevarchar(255)标签名外键,参照Tags(tName),级联删除SET NULL,级联更新SET NULL
6cNamevarchar(255)所属分类外键,参照Category(cName),级联删除SET NULL,级联更新SET NULL
7lastTimedatetime最后更新时间非空

Category(分类表):

数据定义语言:

CREATE TABLE `Category`  (
  `cNo` int(255) NOT NULL AUTO_INCREMENT COMMENT '分类编号',
  `cName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '分类名',
  `cNoai` int(255) UNSIGNED NULL DEFAULT 0 COMMENT '分类包含文章数量',
  `cParents` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '父级分类',
  PRIMARY KEY (`cNo`) USING BTREE,
  UNIQUE INDEX `分类名`(`cName`) USING BTREE
)
序号字段名类型含义备注
1cNoint(255)分类编号主键,自增
2cNamevarchar(255)分类名非空
3cNoaiint(255)分类包含文章数量
4cParentvarchar(255)父级分类

Comment(评论表):

数据定义语言:

CREATE TABLE `Comments`  (
  `cNo` int(255) NOT NULL AUTO_INCREMENT COMMENT '评论编号',
  `cContent` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '评论内容',
  `uName` varchar(25) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '评论用户',
  `cTime` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '评论时间',
  `pNo` int(255) NULL DEFAULT NULL COMMENT '评论文章编号',
  `cConContent` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '评论回复',
  PRIMARY KEY (`cNo`) USING BTREE,
  INDEX `评论用户`(`uName`) USING BTREE,
  INDEX `评论文章编号`(`pNo`) USING BTREE,
  CONSTRAINT `评论文章编号` FOREIGN KEY (`pNo`) REFERENCES `Posts` (`pNo`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `评论用户` FOREIGN KEY (`uName`) REFERENCES `User` (`uName`) ON DELETE SET NULL ON UPDATE CASCADE
)
序号字段名类型含义备注
1cNoint(255)评论编号主键,自增
2cContentvarchar(255)评论内容非空
3uNamevarchar(25)评论用户外键,参照User(uName),级联删除SET NULL,级联更新CASCADE
4cTimedatetime评论时间非空
5pNoint(255)评论文章编号外键,参照Posts(pNo),级联删除SET NULL,级联更新SET NULL
6cConContentvarchar(255)评论回复默认为NULL

Pages(页面表)

数据定义语言:

CREATE TABLE `Pages`  (
  `pNo` int(255) NOT NULL AUTO_INCREMENT COMMENT '页面编号',
  `pName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '页面名称',
  `uName` varchar(25) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建用户',
  `pParent` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '父级页面',
  `pNow` bigint(255) NULL DEFAULT 0 COMMENT '包含字数',
  `pUptime` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
  PRIMARY KEY (`pNo`) USING BTREE,
  UNIQUE INDEX `页面名称`(`pName`) USING BTREE,
  INDEX `创建用户`(`uName`) USING BTREE,
  CONSTRAINT `创建用户` FOREIGN KEY (`uName`) REFERENCES `User` (`uName`) ON DELETE SET NULL ON UPDATE CASCADE
)
序号字段名类型含义备注
1pNoint(255)页面编号主键,自增
2pNamevarchar(255)页面名称非空,唯一
3uNamevarchar(25)创建用户外键,参照User(uName),级联删除SET NULL,级联更新CASCADE
4pParentvarchar(255)父级页面
5pNowbigint(255)包含数字
6pUptimedatetime最后更新时间非空

Tags(标签表):

数据定义语言:

CREATE TABLE `Tags`  (
  `tID` int(255) NOT NULL AUTO_INCREMENT COMMENT '标签编号',
  `tName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '标签名',
  `tCite` text CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '引用文章',
  PRIMARY KEY (`tID`) USING BTREE,
  UNIQUE INDEX `标签名`(`tName`) USING BTREE
)
序号字段名类型含义备注
1tIDint(255)标签编号主键,自增
2tNamevarchar(255)标签名非空,唯一
3tCitetext引用文章非空

Smtp(发送邮件):

数据定义语言:

CREATE TABLE `Smtp`  (
  `sID` int(255) NOT NULL AUTO_INCREMENT COMMENT '邮件编号',
  `sTimestamp` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '发送时间',
  `sTo` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '收件人邮箱',
  `sTheme` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '邮件主题',
  `sMessage` text CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '邮件内容',
  PRIMARY KEY (`sID`) USING BTREE,
  INDEX `收件人邮箱`(`sTo`) USING BTREE,
  CONSTRAINT `收件人邮箱` FOREIGN KEY (`sTo`) REFERENCES `User` (`uEmail`) ON DELETE CASCADE ON UPDATE CASCADE
)
序号字段名类型含义备注
1sIDint(255)邮件编号主键,自增
2sTimestampdatetime发送时间非空
3sTOvarchar(255)收件人邮箱外键,参照User(uEmail),级联删除更新CASCADE
4sThemevarchar(255)邮件主题默认为空

Orders(订单表):

数据定义语言:

CREATE TABLE `Orders`  (
  `OrderID` int(255) NOT NULL AUTO_INCREMENT COMMENT '订单编号',
  `uName` varchar(25) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户昵称',
  `OrderDate` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '订单时间',
  `Status` enum('1','0') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0' COMMENT '订单状态',
  PRIMARY KEY (`OrderID`) USING BTREE,
  UNIQUE INDEX `订单编号`(`OrderID`) USING BTREE,
  INDEX `用户昵称`(`uName`) USING BTREE,
  CONSTRAINT `用户昵称` FOREIGN KEY (`uName`) REFERENCES `User` (`uName`) ON DELETE SET NULL ON UPDATE CASCADE
)
序号字段名类型含义备注
1OrderIDint(255)订单编号主键,自增
2uNamevarchar(25)用户昵称外键,参照User(uName),级联删除SET NULL,级联更新CASCADE
3OrderDatedatetime订单时间非空
4Statusenum(‘0’,‘1’)订单状态默认为0,非空
订单状态

OrderDetails(订单明细表):

数据定义语言:

CREATE TABLE `OrderDetails`  (
  `OrderID` int(255) NULL DEFAULT NULL COMMENT '订单编号',
  `ProductID` int(255) NULL DEFAULT NULL COMMENT '商品编号',
  `Quantity` int(255) NOT NULL COMMENT '商品数量',
  `UnitPrice` decimal(6, 2) UNSIGNED NULL DEFAULT NULL COMMENT '单价',
  `Discount` decimal(3, 2) UNSIGNED ZEROFILL NULL DEFAULT 1.00 COMMENT '折扣',
  INDEX `订单编号`(`OrderID`) USING BTREE,
  INDEX `商品编号`(`ProductID`) USING BTREE,
  INDEX `单价`(`UnitPrice`) USING BTREE,
  CONSTRAINT `单价` FOREIGN KEY (`UnitPrice`) REFERENCES `Products` (`UnitPrice`) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT `商品编号` FOREIGN KEY (`ProductID`) REFERENCES `Products` (`ProductID`) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT `订单编号` FOREIGN KEY (`OrderID`) REFERENCES `Orders` (`OrderID`) ON DELETE SET NULL ON UPDATE CASCADE
)
序号字段名类型含义备注
1OrderIDint(255)订单编号外键,参照Orders(OrderID),级联删除SET NULL,级联更新CASCADE,默认为NULL
2ProductIDint(255)商品编号外键,参照Products(ProductID),级联删除SET NULL,级联更新CASCADE,默认为NULL
3Quantityint(255)商品数量非空
4UnitPricedecimal(6,2),unsigned单价外键,参照Products(UnitPrice),级联删除SET NULL,级联更新CASCADE,默认为NULL
5Discountdecimal(3,2),unsigned折扣默认为1.00

Products(商品表):

数据定义语言:

CREATE TABLE `Products`  (
  `ProductID` int(255) NOT NULL AUTO_INCREMENT COMMENT '商品编号',
  `sNo` int(255) NULL DEFAULT NULL COMMENT '供应商编号',
  `ProductName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '商品名称',
  `UnitInStock` int(255) UNSIGNED NULL DEFAULT NULL COMMENT '库存',
  `UnitPrice` decimal(6, 2) UNSIGNED NULL DEFAULT NULL COMMENT '单价',
  PRIMARY KEY (`ProductID`) USING BTREE,
  INDEX `UnitPrice`(`UnitPrice`) USING BTREE,
  INDEX `sNo`(`sNo`) USING BTREE,
  CONSTRAINT `sNo` FOREIGN KEY (`sNo`) REFERENCES `Suppliers` (`sNo`) ON DELETE SET NULL ON UPDATE CASCADE
)
序号字段名类型含义备注
1ProductIDint(255)商品编号主键,自增
2sNoint(255)供应商编号外键,参照Suppliers(sNo)级联删除SET NULL,级联更新CASCADE,默认为NULL
3ProductNamevarchar(255)商品名称默认为NULL
4UnitInStockint(255),unsigned库存默认为NULL
5UnitPricedecimal(6,2),unsigned单价默认为NULL

Suppliers(供应商表):

数据定义语言:

CREATE TABLE `Suppliers`  (
  `sNo` int(255) NOT NULL AUTO_INCREMENT COMMENT '供应商编号',
  `uAc` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户账户名',
  `uId` varchar(6) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户身份',
  PRIMARY KEY (`sNo`) USING BTREE,
  INDEX `用户账户`(`uAc`) USING BTREE,
  INDEX `用户身份`(`uId`) USING BTREE,
  CONSTRAINT `用户账户` FOREIGN KEY (`uAc`) REFERENCES `User` (`uAc`) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT `用户身份` FOREIGN KEY (`uId`) REFERENCES `User` (`uId`) ON DELETE SET NULL ON UPDATE CASCADE
)
序号字段名类型含义备注
1sNoint(255)供应商编号主键,自增
2uAcvarchar(16)用户账户名外键,参照User(uAc),级联删除SET NULL,级联更新CASCADE,默认为NULL
3uIdvarchar(6)用户身份外键,参照User(uId)级联删除SET NULL,级联更新CASCADE,默认为NULL
触发器
OrderDetails(订单明细):

①使用触发器实现检查约束,确保插入订单明细时,其折扣在[0,1]范围内。如果小于0,则为0;如果大于1,则为1

DELIMITER $$
CREATE TRIGGER od_insert_before_trigger BEFORE INSERT ON OrderDetails
FOR EACH ROW
BEGIN
    IF NEW.discount<0 THEN SET NEW.discount=0;
    ELSEIF NEW.discount>1 THEN SET NEW.discount=1;
END IF;
END
$$

②使用触发器实现检查约束,确保更新订单明细中的记录时其折扣在[0,1]范围内。如果不在该范围内,则为原来的值。

DELIMITER $$
CREATE TRIGGER od_update_ before_trigger BEFORE UPDATE ON OrderDetails
FOR EACH ROW
BEGIN
    IF NEW.discount<0 OR NEW.discount>1 THEN
    SET NEW.discount=OLD.discount;
END IF;
END
$$
Orders(订单表):

①使用触发器实现关联数据修改,当订单状态由0变为1时,变更对应商品的在单数量及库存数量。

DELIMITER $$
CREATE TRIGGER orders_update_before_trigger BEFORE UPDATE ON Orders
FOR EACH ROW
BEGIN
    IF NEW.Status=1 AND OLD.Status=0 THEN
    UPDATE Products INNER JOIN OrderDetails ON 
    Products.ProductID=OrderDetails.ProductID
    SET UnitsInStock=UnitsInStock-Quantity,
    UnitsOnOrder=UnitsOnOrder-Quantity
    WHERE OrderDetails.OrderID=NEW.OrderID;
END IF;
END
$$

规范化分析

User(用户表):

(1)F={用户编号->用户账户名

用户编号->用户密码

用户编号->用户身份

用户编号->用户性别

用户编号->用户年龄

用户编号->用户昵称

用户编号->用户手机号

用户编号->用户邮箱

用户编号->用户IP地址

用户编号->用户等级

用户编号->会员等级

用户编号->用户收藏

用户编号->用户文章数量

用户编号->用户余额

用户编号->注册时间

用户编号->注销时间

用户账户名->用户编号

用户账户名->用户密码

用户账户名->用户身份

用户账户名->用户性别

用户账户名->用户年龄

用户账户名->用户昵称

用户账户名->用户手机号

用户账户名->用户邮箱

用户账户名->用户IP地址

用户账户名->用户等级

用户账户名->会员等级

用户账户名->用户收藏

用户账户名->用户文章数量

用户账户名->用户余额

用户账户名->注册时间

用户账户名->注销时间

用户手机号->用户编号

用户手机号->用户账户名

用户手机号->用户密码

用户手机号->用户身份

用户手机号->用户性别

用户手机号->用户年龄

用户手机号->用户昵称

用户手机号->用户邮箱

用户手机号->用户IP地址

用户手机号->用户等级

用户手机号->会员等级

用户手机号->用户收藏

用户手机号->用户文章数量

用户手机号->用户余额

用户手机号->注册时间

用户手机号->注销时间

用户邮箱->用户编号

用户邮箱->用户账户名

用户邮箱->用户密码

用户邮箱->用户身份

用户邮箱->用户性别

用户邮箱->用户年龄

用户邮箱->用户昵称

用户邮箱->用户手机号

用户邮箱->用户IP地址

用户邮箱->用户等级

用户邮箱->会员等级

用户邮箱->用户收藏

用户邮箱->用户文章数量

用户邮箱->用户余额

用户邮箱->注册时间

用户邮箱->注销时间}

(2)码:用户编号、用户账户名、用户手机号、用户邮箱

 主属性:用户编号、用户账户名、用户手机号、用户邮箱

(3)非主属性:用户密码、用户身份、用户性别、用户年龄、用户昵称、用户手机号、用户IP地址、用户等级、会员等级、用户收藏、用户文章数量、用户余额、注册时间、注销时间

(4)用户关系模式中每一个非主属性既不部分依赖于码也不传递依赖于码,所有非主属性对每一个码都完全函数依赖,所有主属性对每个不包含它的码都完全函数依赖,没有任何属性完全函数依赖于非码的任何一组属性。因此用户关系模式属于BCNF。

Posts(文章表):

(1)F={文章编号->文章名

文章编号->文章作者

文章编号->所属分类

文章编号->标签名

文章编号->文章字数

        文章编号->最后更新时间}

(2)码:文章编号

     主属性:文章编号

(3)非主属性:文章名,文章作者,所属分类,文章字数,最后更新时间

(4)文章关系模式中每一个非主属性既不部分依赖于码也不传递依赖于码,所有非主属性对每一个码都完全函数依赖,所有主属性对每个不包含它的码都完全函数依赖,没有任何属性完全函数依赖于非码的任何一组属性。因此文章关系模式属于BCNF。

Category(分类表):

(1)F={分类编号->分类名

    分类编号->分类包含文章数量

分类编号->父级分类}

(2)码:分类编号

 主属性:分类编号

(3)非主属性:分类名,分类包含文章数量,父级分类

(4)分类关系模式中每一个非主属性既不部分依赖于码也不传递依赖于码,所有非主属性对每一个码都完全函数依赖,所有主属性对每个不包含它的码都完全函数依赖,没有任何属性完全函数依赖于非码的任何一组属性。因此分类关系模式属于BCNF。

Comments(评论表):

(1)F={评论编号->评论内容

    评论编号->评论用户

    评论编号->评论时间

    评论编号->评论文章编号

    评论编号->评论回复}

(2)码:评论编号

 主属性:评论编号

(3)非主属性:评论内容,评论用户,评论时间,评论文章编号,评论回复

(4)评论关系模式中每一个非主属性既不部分依赖于码也不传递依赖于码,所有非主属性对每一个码都完全函数依赖,所有主属性对每个不包含它的码都完全函数依赖,没有任何属性完全函数依赖于非码的任何一组属性。因此评论关系模式属于BCNF。

Pages(页面表):

(1)F={页面编号->页面名称

    页面编号->创建用户

    页面编号->包含字数

    页面编号->父级页面

    页面编号->最后更新时间

页面名称->页面编号

页面名称->创建用户

页面名称->包含字数

页面名称->父级页面

页面名称->最后更新时间}

(2)码:页面编号,页面名称

 主属性:页面编号,页面名称

(3)非主属性:创建用户,包含字数,父级页面,最后更新时间

(4)页面关系模式中每一个非主属性既不部分依赖于码也不传递依赖于码,所有非主属性对每一个码都完全函数依赖,所有主属性对每个不包含它的码都完全函数依赖,没有任何属性完全函数依赖于非码的任何一组属性。因此页面关系模式属于BCNF。

Tags(标签表):

(1)F={标签编号->标签名

标签编号->引用文章

标签名->标签编号

标签名->引用文章}

(2)码:标签编号,标签名

 主属性:标签编号,标签名

(3)非主属性:引用文章

(4)标签关系模式中每一个非主属性既不部分依赖于码也不传递依赖于码,所有非主属性对每一个码都完全函数依赖,所有主属性对每个不包含它的码都完全函数依赖,没有任何属性完全函数依赖于非码的任何一组属性。因此标签关系模式属于BCNF。

Smtp(发送邮件):

(1)F={邮件编号->邮件主题

    邮件编号->邮件内容

    邮件编号->收件人邮箱

    邮件编号->发送时间}

(2)码:邮件编号

 主属性:邮件编号

(3)非主属性:邮件主题,邮件内容,收件人邮箱,发送时间

(4)发送邮件关系模式中每一个非主属性既不部分依赖于码也不传递依赖于码,所有非主属性对每一个码都完全函数依赖,所有主属性对每个不包含它的码都完全函数依赖,没有任何属性完全函数依赖于非码的任何一组属性。因此发送邮件关系模式属于BCNF。

Orders(订单表):

(1)F={订单编号->用户昵称

    订单编号->订单时间

    订单编号->订单状态}

(2)码:订单编号

 主属性:订单编号

(3)非主属性:用户昵称,订单时间,订单状态

(4)订单关系模式中每一个非主属性既不部分依赖于码也不传递依赖于码,所有非主属性对每一个码都完全函数依赖,所有主属性对每个不包含它的码都完全函数依赖,没有任何属性完全函数依赖于非码的任何一组属性。因此订单关系模式属于BCNF。

OrderDetails(订单明细):

(1)F={商品编号->单价

订单编号->折扣

   (订单编号,商品编号)->商品数量}

(2)码:(商品编号,订单编号)

 主属性:商品编号,订单编号

(3)非主属性:单价,折扣,商品数量

(4)订单明细关系模式种既不存在非主属性对码的部分函数依赖,也不存在非主属性对码的传递函数依赖,因此订单明细关系模式属于3NF。考虑到数据冗余情况,因此不将该关系模式分解为BCNF。

Products(商品):

(1)F={商品编号->商品名称

商品编号->供应商编号

商品编号->单价

商品编号->库存}

(2)码:商品编号

 主属性:商品编号

(3)非主属性:商品名称,供应商编号,单价,库存

(4)商品关系模式中每一个非主属性既不部分依赖于码也不传递依赖于码,所有非主属性对每一个码都完全函数依赖,所有主属性对每个不包含它的码都完全函数依赖,没有任何属性完全函数依赖于非码的任何一组属性。因此商品关系模式属于BCNF。

Suppliers(供应商表):

(1)F={供应商编号->用户身份

用户身份->用户账户名}

(2)码:供应商编号

     主属性:供应商编号

(3)非主属性:用户身份,用户账户名

(4)供应商关系模式由于非主属性存在对码的传递函数依赖,所以供应商关系模式不属于3NF,但供应商关系模式不存在对码的部分函数依赖,所以供应商关系模式属于2NF。

若将供应商关系模式分解为3NF,结果为:供应商(供应商编号,用户账户名);供应商(供应商编号、用户身份),造成了不必要的数据冗余,因此不将该关系模式分解。

总结

最终在可视化工具Navicat中预览了所有数据库表。

Navicat16工具下载与使用:最新Navicat Premium 16下载与安装教程 – RFZF Learning

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇