【结构设计】数据表设计、常用表结构设计


数据库设计两个必须

为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。

最为常见的设计范

细分字段,确保每列可用

比如:某些数据库系统中需要用到“地址”这个字段

地址一般包括:省 市 县 区 详细地址

我们当然可以存储一个字段 使用分隔符、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;