数据库设计两个必须
为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。
最为常见的设计范
细分字段,确保每列可用
比如:某些数据库系统中需要用到“地址”这个字段
地址一般包括:省 市 县 区 详细地址
我们当然可以存储一个字段 使用分隔符、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;