网站服务公司有哪些,网站建设经费的函,呼和浩特网站建设价位,网站店招用什么软件做的场景
你作为一个服务端工程师#xff0c;假设产品要求设计这么一个页面#xff0c;页面上包含很多模块#xff0c;每个模块都可以单独进行变更#xff0c;有些模块是富文本。 实现方式有很多#xff0c;我们来聊比较常用的两种#xff0c;看看mysql的表如何设计。
第一…场景
你作为一个服务端工程师假设产品要求设计这么一个页面页面上包含很多模块每个模块都可以单独进行变更有些模块是富文本。 实现方式有很多我们来聊比较常用的两种看看mysql的表如何设计。
第一种使用key-val的方案这就需要两张表。
CREATE TABLE playground (id bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 主键ID,name varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT COMMENT 名称,operator_id bigint unsigned NOT NULL DEFAULT 0 COMMENT 操作人id,status tinyint unsigned NOT NULL DEFAULT 0 COMMENT 状态1使用 2删除,create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间,update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间,PRIMARY KEY (id),KEY idx_operator_id (operator_id),KEY idx_create_time (create_time)
) ENGINEInnoDB COLLATEutf8mb4_general_ci COMMENTplayground项目信息CREATE TABLE current_info (id bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 主键ID,playground_id bigint unsigned NOT NULL COMMENT playground_id,item_type int NOT NULL DEFAULT 0 COMMENT 每个模块的id,content text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT 模块内容,operator_id bigint unsigned NOT NULL DEFAULT 0 COMMENT 操作人id,status tinyint unsigned NOT NULL DEFAULT 0 COMMENT 状态1使用 2删除,create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间,update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间,PRIMARY KEY (id),KEY idx_playground_id (playground_id)
) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_general_ci COMMENT当前信息第二种方式则是放在一张表记录
CREATE TABLE current_info (id bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 主键ID,name varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT COMMENT 名称,description varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT COMMENT 描述,status tinyint unsigned NOT NULL DEFAULT 0 COMMENT 状态0无效1有效,create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间,update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间,creator_id bigint unsigned NOT NULL DEFAULT 0 COMMENT 创建者ID,a text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT a模块内容,b text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT b模块内容,PRIMARY KEY (id),KEY idx_creator_id (creator_id),KEY idx_create_time (create_time),KEY idx_update_time (update_time)
) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_general_ci COMMENT内容表对于这两种方案你会如何选择
对比
我个人建议选择正常存储的方案因为适应面更加广泛
Key-val正常存储优点增加新模块服务端无需感知前端自行增加即可实现复杂度低很多缺点1. 即使是普通的列表实现起来也比较复杂必须有一张主表 2.列表排序、筛选不好实现如按照修改时间排序、根据名称筛选等 3.数量多页面数据会有多条 4.字段浪费严重每个字段必须一样大部分情况是是text每次有新增模块服务端需要一起修改。但这个比较正常大部分时候新增的功能服务端总是需要做一些改动的
总结
对于技术方案的选择十分重要尤其是作为第一版的设计者。怎么知道哪个方案更加合适呢我的想法是找到当前的各个场景和预判将来的各个场景思考一下如果用某套方案实现这些场景成本如何。