数据库表设计

介绍

Mineadmin具有强大的自动生成前后端代码功能,后台功能工具->代码生成器

为了方便使用和配置自动生成器,我们设计了一套表备注来帮助生成代码

主键设计选择

雪花ID主键 Snowflake

雪花ID,使用的hyperf官方提供的包,具体算法设计模式可以查看链接open in new window 非自增ID,mineadmin就会自动维护生成

`id` bigint(20) NOT NULL

为什么使用雪花ID,使用雪花ID有什么好处

使用雪花算法生成ID的好处包括: 全局唯一性,高性能,趋势递增,分布式

一个案例来说明在开发中使用雪花ID的好处,这个案例我们可以看出,使用雪花ID我们并不需要担心在代码逻辑中批量生成ID时候,ID重复的情况,也就是说我们在开发中,只需要关系数据的写入时候ID是否关联上,这是自增ID很难做到的点。

// 生成订单数据
function generateOrders($count) {
    $orders = [];
    for ($i = 0; $i < $count; $i++) {
        $order = [
            'id' => snowflake_id(), // 使用雪花算法生成唯一ID
            'user_id' => mt_rand(1, 100), // 假设用户ID在1到100之间
            'created_at' => date('Y-m-d H:i:s'),
            'updated_at' => date('Y-m-d H:i:s'),
        ];
        $orders[] = $order;
    }
    return $orders;
}

// 生成订单商品数据
function generateOrderItems($order_id, $count) {
    $orderItems = [];
    for ($i = 0; $i < $count; $i++) {
        $orderItem = [
            'id' => snowflake_id(),
            'order_id' => $order_id,
            'product_id' => mt_rand(1, 50), // 假设商品ID在1到50之间
            'quantity' => mt_rand(1, 5),
            'created_at' => date('Y-m-d H:i:s'),
            'updated_at' => date('Y-m-d H:i:s'),
        ];
        $orderItems[] = $orderItem;
    }
    return $orderItems;
}

// 一次性生成并插入订单数据和订单商品数据
$count = 10; // 假设要插入10个订单
$orders = generateOrders($count);
$orderItems = [];

foreach ($orders as $order) {
    $orderItems = array_merge($orderItems, generateOrderItems($order['id'], mt_rand(1, 3))); // 每个订单插入1到3个商品
}

Db::transaction(function () use ($orders, $orderItems) {
    Db::table('orders')->insert($orders);
    Db::table('order_items')->insert($orderItems);
});

自增主键

数据库自带的自增ID

`id` bigint(20) NOT NULL AUTO_INCREMENT

表字段类型设置以及字段备注

字段名

字段名例如输入框类型
imagemine_image单图片上传
imagesmine_images多图片上传
filemine_file单文件上传
filesmine_files多文件上传

字段数据类型

字段类型搜索标识符输入框类型表备注
tinyint、int、biginteq数字输入框、选择输入框类型:1=类型1,2=类型2
varcharlike文本输入框
text、longtextno富文本
timestamp、datetimebetween日期时间组件
datebetween日期组件
jsonno

示例DDL

CREATE TABLE `print_test`  (
  `id` bigint(20) NOT NULL,
  `type` tinyint(4) NOT NULL COMMENT '类型:1=是,0=否',
  `conetnt` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '富文本',
  `image` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '图片上传',
  `file` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '文件上传',
  `images` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '多图片上传',
  `files` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '多文件上传',
  `datetime` datetime NULL DEFAULT NULL COMMENT '日期时间',
  `date` date NULL DEFAULT NULL COMMENT '日期',
  `user_id` int(10) NULL DEFAULT NULL COMMENT '用户',
  `json` json NULL COMMENT '数组',
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `user_id_index`(`user_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '测试表' ROW_FORMAT = Dynamic;