数据库设计两个必须
为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。
最为常见的设计范
细分字段,确保每列可用
比如:某些数据库系统中需要用到“地址”这个字段
地址一般包括:省 市 县 区 详细地址
我们当然可以存储一个字段 使用分隔符、json、等存储
- 缺点本来直接将“地址”字段,设计成一个数据库表的字段就行。
- 优点将“地址”这个属性重新拆分为省份、城市、详细地址等多个部分进行存储,这样在对地址中某一部分操作的时候将非常方便。这样设计才算满足了数据库添加修改删除查询的便利
关联使用主键、避免字段冗余字段
- 表与表之间关联,使用主键。主键是一种索引,可以提高效率
- 多关联建议使用中间表
设计数据实例
公共评论表数据库结构设计
介绍
- 满足大部分系统回复功能。使用CommentedObjectId,无论对文章资讯新闻等等都可以评论
- 满足根据子评论查询所有父评论的功能,因为 ParentIdList格式为 ,id,id,id, 可以满足模糊查询 ParentIdList like \',%id%,\'
- 满足用户评论用户的功能。可以互相回复
字段介绍
| 字段 | 介绍 |
|---|---|
| Id | bigint \'Id\', |
| ParentId | int \'父评论Id\', |
| ParentIdList | varchar \'父评论Id\', |
| ChildCount | int \'子级评论数量\', |
| edObjectId | int \'被评论对象Id\', |
| OwnerId | int \'所属ID\', |
| TenantTypeId | int \'租户类型Id\', |
| UserId | int \'评论人UserId\', |
| UserName | varchar \'评论人名称\', |
| ToUserId | int \'被回复UserId(一级ToUserId为0)\', |
| ToUserName | varchar \'被回复人名称(一级ToUserDisplayName为空字符串)\', |
| Title | varchar \'标题\', |
| Body | varchar \'内容\', |
| IsPrivate | tinyint \'是否悄悄话\', |
| IsAnonymous | tinyint \'是否匿名评论\', |
| AuditStatus | tinyint \'审核状态\', |
| IsDel | tinyint \'是否删除\', |
| LikeCount | int \'喜欢数量\', |
| CreateTime | datetime \'创建时间\', |
| StarCount | int \'星级评价\', |
| Depth | int \'深度\', |
Mysql 脚本
CREATE TABLE `sop_comments` (
`Id` bigint(8) NOT NULL AUTO_INCREMENT COMMENT \'Id\',
`ParentId` int(11) NULL DEFAULT NULL COMMENT \'父评论Id\',
`ParentIdList` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT \'父评论Id\',
`ChildCount` int(4) NULL DEFAULT 0 COMMENT \'子级评论数量\',
`Depth` int(255) NULL DEFAULT NULL COMMENT \'深度\',
`CommentedObjectId` int(11) NULL DEFAULT NULL COMMENT \'被评论对象Id(是话题还是文章、百科、商城、等等......)\',
`OwnerId` int(11) NULL DEFAULT NULL COMMENT \'所属ID\',
`TenantTypeId` int(11) NULL DEFAULT NULL COMMENT \'租户类型Id\',
`UserId` int(11) NULL DEFAULT NULL COMMENT \'评论人UserId\',
`UserName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT \'评论人名称\',
`ToUserId` int(11) NULL DEFAULT NULL COMMENT \'被回复UserId(一级ToUserId为0)\',
`ToUserName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT \'\' COMMENT \'被回复人名称(一级ToUserDisplayName为空字符串)\',
`Title` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT \'标题\',
`Body` varchar(1024) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT \'内容\',
`IsPrivate` tinyint(4) NULL DEFAULT NULL COMMENT \'是否悄悄话\',
`IsAnonymous` tinyint(2) NULL DEFAULT NULL COMMENT \'是否匿名评论\',
`AuditStatus` tinyint(4) NULL DEFAULT 0 COMMENT \'审核状态\',
`IsDel` tinyint(2) NULL DEFAULT 1 COMMENT \'是否删除\',
`LikeCount` int(4) NULL DEFAULT NULL COMMENT \'喜欢数量\',
`CreateTime` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT \'创建时间\',
`StarCount` int(11) NULL DEFAULT 0,
PRIMARY KEY (`Id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = \'评论信息表\' ROW_FORMAT = Dynamic;