|
@@ -0,0 +1,206 @@
|
|
|
+# AI智慧农业项目
|
|
|
+
|
|
|
+# 数据范式设计
|
|
|
+> 设定要求
|
|
|
+您是一名专业的数据库工程师,熟悉PostgreSQL和ParseServer。
|
|
|
+请注意表名用大驼峰,字段小驼峰。
|
|
|
+有预留字段:objectId、updatedAt、createdAt。
|
|
|
+关于ParseServer中数据类的描述,字段的主要类型有:
|
|
|
+String => String
|
|
|
+Number => Number
|
|
|
+Bool => bool
|
|
|
+Array => JSON Array
|
|
|
+Object => JSON Object
|
|
|
+Date => Date
|
|
|
+File => Parse.File
|
|
|
+Pointer => other Parse.Object
|
|
|
+Relation => Parse.Relation
|
|
|
+Null => null
|
|
|
+GeoPoint => {latitude: 40.0, longitude: -30.0}
|
|
|
+
|
|
|
+> 项目需求
|
|
|
+智慧农田的辅助AI应用,农民(_User)、农田、农事提醒、生长记录,请您根据农业种植的行业经验,设计以上四张表,农民直接用预留的_User表即可。
|
|
|
+
|
|
|
+> 输出结果(UML类图)
|
|
|
+请您帮我用plantuml的类图描述设计好的几张表及其关系
|
|
|
+
|
|
|
+> 输出结果(信息结构图)
|
|
|
+请您帮我用markmap格式表示上面的信息结构图
|
|
|
+
|
|
|
+> 输出结果(SQL语句)
|
|
|
+请您帮我用sql格式给我建表语句和测试数据插入语句,注意字段请使用小驼峰用""引起来。
|
|
|
+
|
|
|
+# UML类图
|
|
|
+```plantuml
|
|
|
+@startuml
|
|
|
+class _User {
|
|
|
+ <<Parse内置类>>
|
|
|
+ + username: String
|
|
|
+ + password: String
|
|
|
+ + email: String
|
|
|
+ + mobilePhone: String
|
|
|
+ + ...其他内置字段
|
|
|
+}
|
|
|
+
|
|
|
+class Farmland {
|
|
|
+ + objectId: String
|
|
|
+ + createdAt: Date
|
|
|
+ + updatedAt: Date
|
|
|
+ + farmlandName: String
|
|
|
+ + area: Number
|
|
|
+ + cropType: String
|
|
|
+ + geoLocation: {latitude: Number, longitude: Number}
|
|
|
+ + owner: Pointer<_User>
|
|
|
+ + status: String // 如"播种期","生长期","成熟期"
|
|
|
+ + irrigationSystem: String
|
|
|
+}
|
|
|
+
|
|
|
+class FarmingReminder {
|
|
|
+ + objectId: String
|
|
|
+ + createdAt: Date
|
|
|
+ + updatedAt: Date
|
|
|
+ + reminderType: String // 如"灌溉","施肥","除虫"
|
|
|
+ + content: String
|
|
|
+ + dueDate: Date
|
|
|
+ + isCompleted: bool
|
|
|
+ + farmland: Pointer<Farmland>
|
|
|
+ + priority: Number
|
|
|
+}
|
|
|
+
|
|
|
+class GrowthRecord {
|
|
|
+ + objectId: String
|
|
|
+ + createdAt: Date
|
|
|
+ + updatedAt: Date
|
|
|
+ + recordType: String // 如"文字记录","图片记录"
|
|
|
+ + description: String
|
|
|
+ + recordDate: Date
|
|
|
+ + images: Array<Parse.File>
|
|
|
+ + farmland: Pointer<Farmland>
|
|
|
+ + growthStage: String
|
|
|
+ + temperature: Number
|
|
|
+ + humidity: Number
|
|
|
+}
|
|
|
+
|
|
|
+_User "1" -- "n" Farmland : owns
|
|
|
+Farmland "1" -- "n" FarmingReminder : has
|
|
|
+Farmland "1" -- "n" GrowthRecord : contains
|
|
|
+@enduml
|
|
|
+```
|
|
|
+
|
|
|
+# SQL语句
|
|
|
+
|
|
|
+以下是使用小驼峰命名并用双引号包裹字段名的PostgreSQL建表语句和测试数据插入语句:
|
|
|
+
|
|
|
+### 1. 建表语句
|
|
|
+
|
|
|
+```sql
|
|
|
+-- 用户表(使用Parse内置的_User表,此处仅创建扩展表)
|
|
|
+CREATE TABLE "User" (
|
|
|
+ "objectId" VARCHAR(36) PRIMARY KEY,
|
|
|
+ "username" VARCHAR(50) NOT NULL UNIQUE,
|
|
|
+ "email" VARCHAR(100),
|
|
|
+ "mobilePhone" VARCHAR(20),
|
|
|
+ "createdAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
+ "updatedAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
|
+);
|
|
|
+
|
|
|
+-- 农田表
|
|
|
+CREATE TABLE "Farmland" (
|
|
|
+ "objectId" VARCHAR(36) PRIMARY KEY,
|
|
|
+ "farmlandName" VARCHAR(100) NOT NULL,
|
|
|
+ "area" NUMERIC(10, 2),
|
|
|
+ "cropType" VARCHAR(50),
|
|
|
+ "latitude" NUMERIC(9, 6),
|
|
|
+ "longitude" NUMERIC(9, 6),
|
|
|
+ "ownerId" VARCHAR(36) REFERENCES "User"("objectId"),
|
|
|
+ "status" VARCHAR(20) CHECK ("status" IN ('播种期', '生长期', '成熟期')),
|
|
|
+ "irrigationSystem" VARCHAR(50),
|
|
|
+ "createdAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
+ "updatedAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
|
+);
|
|
|
+
|
|
|
+-- 农事提醒表
|
|
|
+CREATE TABLE "FarmingReminder" (
|
|
|
+ "objectId" VARCHAR(36) PRIMARY KEY,
|
|
|
+ "reminderType" VARCHAR(20) CHECK ("reminderType" IN ('灌溉', '施肥', '除虫')),
|
|
|
+ "content" TEXT,
|
|
|
+ "dueDate" TIMESTAMP NOT NULL,
|
|
|
+ "isCompleted" BOOLEAN DEFAULT false,
|
|
|
+ "farmlandId" VARCHAR(36) REFERENCES "Farmland"("objectId"),
|
|
|
+ "priority" INTEGER DEFAULT 1,
|
|
|
+ "createdAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
+ "updatedAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
|
+);
|
|
|
+
|
|
|
+-- 生长记录表
|
|
|
+CREATE TABLE "GrowthRecord" (
|
|
|
+ "objectId" VARCHAR(36) PRIMARY KEY,
|
|
|
+ "recordType" VARCHAR(20) CHECK ("recordType" IN ('文字记录', '图片记录')),
|
|
|
+ "description" TEXT,
|
|
|
+ "recordDate" TIMESTAMP NOT NULL,
|
|
|
+ "growthStage" VARCHAR(50),
|
|
|
+ "temperature" NUMERIC(5, 2),
|
|
|
+ "humidity" NUMERIC(5, 2),
|
|
|
+ "farmlandId" VARCHAR(36) REFERENCES "Farmland"("objectId"),
|
|
|
+ "createdAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
+ "updatedAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
|
+);
|
|
|
+
|
|
|
+-- 图片存储关联表
|
|
|
+CREATE TABLE "GrowthRecordImages" (
|
|
|
+ "recordId" VARCHAR(36) REFERENCES "GrowthRecord"("objectId"),
|
|
|
+ "fileUrl" VARCHAR(255) NOT NULL,
|
|
|
+ "uploadTime" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
+ PRIMARY KEY ("recordId", "fileUrl")
|
|
|
+);
|
|
|
+```
|
|
|
+
|
|
|
+### 2. 测试数据插入语句
|
|
|
+
|
|
|
+```sql
|
|
|
+-- 插入测试用户
|
|
|
+INSERT INTO "User" ("objectId", "username", "email", "mobilePhone") VALUES
|
|
|
+('usr001', 'farmer_wang', 'wang@example.com', '13800138001'),
|
|
|
+('usr002', 'farmer_li', 'li@example.com', '13900139001');
|
|
|
+
|
|
|
+-- 插入测试农田
|
|
|
+INSERT INTO "Farmland" ("objectId", "farmlandName", "area", "cropType", "latitude", "longitude", "ownerId", "status", "irrigationSystem") VALUES
|
|
|
+('fld001', '王家的麦田', 5.2, '小麦', 39.9042, 116.4074, 'usr001', '生长期', '滴灌系统'),
|
|
|
+('fld002', '李家的玉米地', 8.5, '玉米', 34.3416, 108.9398, 'usr002', '播种期', '喷灌系统');
|
|
|
+
|
|
|
+-- 插入农事提醒
|
|
|
+INSERT INTO "FarmingReminder" ("objectId", "reminderType", "content", "dueDate", "isCompleted", "farmlandId", "priority") VALUES
|
|
|
+('rem001', '灌溉', '麦田需要浇水', CURRENT_TIMESTAMP + INTERVAL '2 days', false, 'fld001', 1),
|
|
|
+('rem002', '施肥', '玉米地需要追肥', CURRENT_TIMESTAMP + INTERVAL '5 days', false, 'fld002', 2);
|
|
|
+
|
|
|
+-- 插入生长记录
|
|
|
+INSERT INTO "GrowthRecord" ("objectId", "recordType", "description", "recordDate", "growthStage", "temperature", "humidity", "farmlandId") VALUES
|
|
|
+('rec001', '文字记录', '小麦抽穗期开始', CURRENT_TIMESTAMP - INTERVAL '3 days', '抽穗期', 22.5, 65.0, 'fld001'),
|
|
|
+('rec002', '图片记录', '玉米幼苗生长情况', CURRENT_TIMESTAMP - INTERVAL '1 day', '幼苗期', 25.0, 70.0, 'fld002');
|
|
|
+
|
|
|
+-- 插入生长记录图片
|
|
|
+INSERT INTO "GrowthRecordImages" ("recordId", "fileUrl") VALUES
|
|
|
+('rec002', 'https://example.com/images/corn_seedling_1.jpg'),
|
|
|
+('rec002', 'https://example.com/images/corn_seedling_2.jpg');
|
|
|
+```
|
|
|
+
|
|
|
+### 修改说明:
|
|
|
+
|
|
|
+1. **命名规范**:
|
|
|
+ - 所有字段名使用小驼峰命名并用双引号包裹
|
|
|
+ - 表名使用大驼峰命名并用双引号包裹
|
|
|
+ - 保留Parse Server原始字段名(如objectId/createdAt/updatedAt)
|
|
|
+
|
|
|
+2. **修正问题**:
|
|
|
+ - 修正了农事提醒表中的字段名拼写错误(reminderType)
|
|
|
+ - 确保所有引用字段名都使用小驼峰格式
|
|
|
+
|
|
|
+3. **兼容性**:
|
|
|
+ - 完全兼容PostgreSQL的标识符引用规则
|
|
|
+ - 保留所有原始设计的约束和关系
|
|
|
+
|
|
|
+4. **测试数据**:
|
|
|
+ - 保持与之前相同的测试场景
|
|
|
+ - 所有字段引用都使用新的命名格式
|
|
|
+
|
|
|
+这种格式可以直接在PostgreSQL中执行,且与Parse Server的命名规范完全一致。如需在其它数据库中使用,可能需要根据数据库特性调整引号的使用方式。
|