Supabase database-build:声明式PostgreSQL架构管理的工程实践

news2026/5/10 6:11:58
1. 项目概述一个数据库构建的“乐高工厂”如果你在Supabase社区里混过一段时间大概率会听说过或者用过supabase-community/database-build这个仓库。乍一看名字它可能被误解为某个数据库的构建脚本或者一个独立的工具。但当你真正深入进去会发现它更像是一个为PostgreSQL数据库量身定制的“乐高工厂”。它的核心价值在于将数据库的构建过程——包括表结构、函数、触发器、策略等所有对象——从一次性的、手动的SQL脚本转变为一个可版本化、可测试、可重复、可组合的现代化工程流程。简单来说它解决了一个非常具体但又普遍存在的痛点如何像管理应用程序代码一样优雅且可靠地管理数据库的变更传统的做法是维护一堆按日期命名的SQL文件比如20240101_create_users_table.sql通过人工或简单的迁移工具按顺序执行。这种方式在小型项目或单人开发时勉强可行一旦团队协作、环境增多开发、测试、生产、或者需要回滚时就变得异常脆弱和混乱。database-build提供了一套基于目录结构和约定的范式让你能用代码的思维去组织数据库的DDL数据定义语言。它不是一个独立的CLI工具而是一套理念和约定的集合通常与supabase db diff和supabase db push等命令协同工作成为Supabase本地开发和数据库变更工作流的核心组成部分。对于任何使用Supabase或PostgreSQL进行严肃项目开发的团队来说理解并应用这套模式能极大提升数据库 schema 管理的安全性和开发体验。2. 核心设计哲学与工作流拆解2.1 从“迁移脚本”到“声明式状态”传统数据库迁移Migration是基于操作的。每个迁移文件描述了一个变更操作“创建表A”、“在表A上添加列B”、“删除列C”。你需要严格按时间顺序执行这些文件并且一旦执行几乎不可逆回滚需要编写专门的下行脚本。这种模式记录了“如何到达当前状态的过程”。database-build倡导的是一种更接近声明式状态管理的思路。你不再编写“如何改变”的指令而是直接定义“最终应该是什么样子”的状态。具体实现上它要求你将数据库的每个对象表、视图、函数、策略等定义在一个独立的SQL文件中并按类型组织到特定的目录里。例如所有的表定义都放在supabase/migrations/tables/目录下。当你运行构建命令时系统会读取这些文件并计算出如何将目标数据库同步到这个声明状态。这两种模式的核心区别在于操作式迁移关心历史路径顺序至关重要容易因顺序错误或遗漏导致状态不一致。声明式状态关心最终结果系统负责计算并执行必要的变更以达到该状态对文件执行顺序的依赖降低。database-build巧妙之处在于它通常与Supabase CLI的db diff命令结合使用。开发流程变为先在本地通过修改这些声明式的SQL文件来定义新的schema状态然后使用db diff对比本地声明状态和远程数据库的实际状态自动生成一个操作式的迁移脚本。最后通过db push或审查生成的迁移脚本后再应用到远程。这样既享受了声明式开发的直观性又通过工具生成了可追溯的操作记录。2.2 目录结构约定约定的力量database-build的强大很大程度上来自于其清晰的目录结构约定。以下是一个典型的项目结构your-project/ ├── supabase/ │ ├── migrations/ # 存放所有数据库定义 │ │ ├── tables/ # 表定义每个表一个.sql文件 │ │ │ ├── users.sql │ │ │ ├── profiles.sql │ │ │ └── posts.sql │ │ ├── functions/ # PostgreSQL函数/存储过程 │ │ │ ├── handle_new_user.sql │ │ │ └── update_updated_at.sql │ │ ├── triggers/ # 触发器定义 │ │ │ └── update_posts_updated_at.sql │ │ ├── policies/ # RLS行级安全策略 │ │ │ ├── users_policies.sql │ │ │ └── posts_policies.sql │ │ ├── views/ # 视图定义 │ │ │ └── active_users.sql │ │ └── seeds/ # 种子数据可选 │ │ └── initial_data.sql │ ├── config.toml # Supabase项目配置 │ └── .gitignore为什么这样设计关注点分离将不同类型的数据库对象物理隔离结构一目了然。新成员加入项目能快速在tables/目录下找到所有表定义而不是在冗长的迁移脚本中搜寻。易于版本控制每个文件的变化如修改users.sql增加一个字段在Git历史中清晰可见便于Code Review。你可以清楚地看到“这次提交修改了users表和相关的policy”。可组合与复用你可以很容易地通过复制整个migrations/目录或部分子目录来为另一个环境如测试库快速搭建相同的schema基础。工具链友好Supabase CLI、CI/CD流水线等工具可以基于这个约定目录进行静态分析、差异比较和自动化部署。注意这个migrations/目录下的内容通常不是直接按顺序执行的迁移文件。它们是“源文件”。真正的、按时间排序的迁移文件可能会由工具如supabase db diff生成在另一个位置如supabase/migrations/根目录下以时间戳命名的文件。理解“源定义目录”和“生成迁移目录”的区别是关键。3. 核心细节解析与实操要点3.1 表定义文件的编写艺术在tables/目录下的每个.sql文件理想情况下应该只包含一个CREATE TABLE语句并且使用CREATE OR REPLACE或更常见的模式先删除如果存在再创建。但后者在包含数据的生产环境中是危险的。更安全的实践是这些文件定义的是“期望的表结构”工具会负责生成ALTER TABLE语句。一个users.sql的示例-- supabase/migrations/tables/users.sql -- 这是一个声明式的定义描述了users表应该有的样子。 -- 它不一定能被直接执行尤其是当表已存在且有数据时。 -- 理想化的“干净”创建语句主要用于新环境初始化 CREATE TABLE IF NOT EXISTS public.users ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), email TEXT UNIQUE NOT NULL, full_name TEXT, avatar_url TEXT, created_at TIMESTAMPTZ DEFAULT NOW(), updated_at TIMESTAMPTZ DEFAULT NOW() ); -- 通常我们还会在这里为这个表创建相关的索引 CREATE INDEX IF NOT EXISTS idx_users_email ON public.users(email); CREATE INDEX IF NOT EXISTS idx_users_created_at ON public.users(created_at); -- 注释是极好的实践说明表的用途和关键字段 COMMENT ON TABLE public.users IS 存储系统用户的核心信息表; COMMENT ON COLUMN public.users.email IS 用户的唯一登录邮箱用于身份验证;实操要点使用IF NOT EXISTS在定义中加上IF NOT EXISTS或IF NOT EXISTS可以避免在直接执行如初始化时报错但真正的同步工具如db diff会忽略这个因为它基于状态对比。包含索引和约束将属于该表的所有索引、唯一约束、外键约束如果外键指向另一个表需注意顺序都写在这个文件里保持完整性。善用注释SQL注释 (COMMENT ON) 是免费的文档。它们会被存储在数据库元数据中许多数据库管理工具能直接显示对团队协作至关重要。3.2 函数与触发器的协同PostgreSQL的函数和触发器是实现业务逻辑的强大工具。database-build模式鼓励将它们模块化。例如一个自动更新updated_at时间戳的触发器-- supabase/migrations/functions/update_updated_at_column.sql -- 创建一个通用函数用于将任何表的‘updated_at’字段设置为当前时间 CREATE OR REPLACE FUNCTION public.update_updated_at_column() RETURNS TRIGGER AS $$ BEGIN NEW.updated_at NOW(); RETURN NEW; END; $$ LANGUAGE plpgsql SECURITY DEFINER; -- supabase/migrations/triggers/tr_users_updated_at.sql -- 将上述函数绑定到users表 CREATE TRIGGER set_updated_at BEFORE UPDATE ON public.users FOR EACH ROW EXECUTE FUNCTION public.update_updated_at_column();注意事项函数与触发器的分离将函数定义和触发器绑定分开。这样同一个函数如update_updated_at_column可以被多个表的触发器复用。安全性注意函数创建时的SECURITY属性。SECURITY DEFINER意味着函数以创建者的权限运行这可能带来风险。对于不涉及敏感操作的工具函数使用默认的SECURITY INVOKER调用者权限更安全。命名一致性为触发器和函数建立一致的命名约定例如tr_table_name_purpose和fn_purpose便于查找和理解。3.3 RLS策略的组织策略Supabase的核心特性之一是内置了PostgreSQL的行级安全RLS。在database-build模式中为每个表单独管理策略是清晰的做法。users_policies.sql示例-- supabase/migrations/policies/users_policies.sql -- 首先确保RLS对users表已启用这是一个幂等操作 ALTER TABLE public.users ENABLE ROW LEVEL SECURITY; -- 策略1用户只能查看自己的信息基于auth.uid() CREATE POLICY 用户可读取自己的数据 ON public.users FOR SELECT USING (auth.uid() id); -- 策略2用户只能更新自己的信息 CREATE POLICY 用户可更新自己的数据 ON public.users FOR UPDATE USING (auth.uid() id) WITH CHECK (auth.uid() id); -- WITH CHECK确保更新后的数据也满足条件 -- 策略3允许系统在注册时插入新用户记录通常在后台函数中完成 CREATE POLICY 服务端可插入用户 ON public.users FOR INSERT WITH CHECK (true); -- 这里可能需要更严格的检查例如通过触发器验证 -- 策略4通常不允许用户删除自己的账户记录软删除更常见 -- CREATE POLICY ...核心技巧策略命名清晰使用描述性的字符串命名策略如用户可读取自己的数据这在错误日志和管理界面中非常有用。理解USING和WITH CHECK对于SELECT、DELETE只使用USING子句定义哪些行可见/可操作。对于INSERT和UPDATEUSING定义哪些现有行可被修改WITH CHECK定义修改后或插入的新行必须满足的条件。这是RLS的难点务必仔细设计。策略顺序PostgreSQL会评估所有适用的策略。默认是PERMISSIVE策略允许只要任何一条PERMISSIVE策略通过即可。也可以定义RESTRICTIVE策略来收紧限制。将策略按逻辑分组写在同一个文件里便于整体审视。4. 完整工作流实操从本地修改到生产部署4.1 本地开发与变更流程假设我们要为posts表添加一个status字段并为其添加索引。修改声明文件打开supabase/migrations/tables/posts.sql在表定义中添加字段。-- 在原有列定义后添加 status TEXT NOT NULL DEFAULT draft CHECK (status IN (draft, published, archived));同时在文件底部添加索引CREATE INDEX IF NOT EXISTS idx_posts_status ON public.posts(status);启动本地Supabase在项目根目录运行supabase start。这会启动一个包含PostgreSQL数据库的本地开发环境其初始状态通常由supabase/migrations目录下的文件或种子定义。生成迁移脚本运行supabase db diff -f add_post_status。这个命令会对比本地数据库的当前状态由migrations/目录结构定义和远程链接数据库在supabase/config.toml中配置通常是你的开发或生产数据库的状态。生成一个名为YYYYMMDDHHMMSS_add_post_status.sql的时间戳迁移文件存放在supabase/migrations/根目录注意不是tables/子目录。这个文件里包含具体的ALTER TABLE和CREATE INDEX语句。审查与测试迁移脚本这是最关键的一步。打开生成的迁移文件仔细检查SQL语句是否正确、安全。特别是当涉及删除列、修改数据类型可能丢失数据等破坏性操作时。你可以在本地重启Supabase (supabase stop supabase start) 来应用所有迁移测试变更是否按预期工作。4.2 团队协作与版本控制提交更改将修改后的posts.sql和生成的YYYYMMDDHHMMSS_add_post_status.sql迁移文件一并提交到Git。posts.sql是“源代码”代表最新的架构意图。时间戳迁移文件是“编译产物”记录了从旧状态到新状态的具体操作。它必须被提交因为其他团队成员或部署环境需要按顺序执行这些迁移文件以达到一致状态。队友同步队友拉取代码后他们本地的migrations/tables/posts.sql文件已经更新。但他们本地的数据库可能还是旧状态。他们可以运行supabase db reset警告这会清空本地数据库数据来根据最新的声明文件完全重建本地数据库。适合开发初期或需要干净状态时。或者运行supabase db push谨慎使用这将根据本地声明状态直接对本地数据库执行必要的变更。对于生产环境绝对不要使用db push一定要使用审查过的迁移脚本。4.3 生产环境部署生产环境的部署必须基于经过审查的、按时间排序的迁移脚本而不是直接使用声明式文件。CI/CD集成在CI/CD流水线如GitHub Actions, GitLab CI中一个典型的部署步骤是检出代码。使用Supabase CLI连接生产数据库。运行supabase db push --dry-run进行预演查看将要执行的SQL可选但推荐。运行supabase migration up或类似的命令按顺序执行supabase/migrations/根目录下所有尚未执行的时间戳迁移文件。Supabase内部会维护一个schema_migrations表来记录已执行的迁移。回滚策略database-build模式本身不自动生成回滚down脚本。对于重要的、破坏性的变更必须手动在生成迁移文件时同时编写一个回滚脚本或确保生成的迁移是可逆的。一种实践是在生成add_post_status迁移后手动创建一个revert_add_post_status.sql文件存放在某个约定目录以备不时之需。更严谨的做法是使用像sqitch这样的专业数据库迁移工具但supabase-community/database-build提供了一种更轻量、与Supabase生态深度集成的选择。5. 常见问题与排查技巧实录5.1 迁移文件冲突与顺序问题问题两名开发者同时基于旧的数据库状态创建了新功能都生成了迁移文件比如20240320090101_add_field_a.sql和20240320090102_add_field_b.sql。但这两个迁移可能都修改了同一个表如果合并顺序不当后应用迁移的数据库可能会因为表结构已变更而执行失败。排查与解决预防优于治疗建立团队规范在生成新迁移前先拉取最新代码并确保本地数据库状态与远程主分支一致可通过supabase db pull获取远程schema变化。手动解决冲突如果冲突已经发生不要简单地重命名迁移文件来调整顺序。需要仔细分析两个迁移文件的SQL内容。可能需要手动编辑第二个迁移文件使其适应第一个迁移应用后的新表结构。例如如果第一个迁移删除了一个列而第二个迁移试图修改这个列就需要修改第二个迁移。使用重置谨慎在开发环境如果迁移状态混乱可以备份数据后使用supabase db reset从头开始。但这绝不是生产环境的选项。5.2 声明文件与数据库实际状态不一致问题直接通过数据库管理工具如pgAdmin或临时SQL查询修改了数据库导致migrations/目录下的声明文件不再反映数据库的真实状态。后续运行db diff会产生大量意想不到的、甚至是破坏性的变更脚本。解决黄金法则所有schema变更必须通过修改声明文件并生成迁移的方式来进行。禁止直接操作数据库schema。状态同步如果不一致已经发生正确的修复方式是使用supabase db pull命令。这个命令会将远程数据库的当前schema拉取下来并覆盖本地的声明文件migrations/目录下的文件。这是让本地声明文件与远程一致的最快方法。拉取后你的本地声明文件就更新了。然后你基于这个更新后的状态再去进行新的功能开发并生成新的迁移。注意db pull是一个强大的命令它会覆盖本地文件。在执行前请确保你已经提交或备份了本地未推送的、有价值的schema更改。5.3 函数或触发器依赖未按顺序创建问题在tables/目录下的文件可能引用了在functions/目录中定义的函数例如作为默认值。如果工具按字母顺序或随机顺序应用这些声明文件创建表时可能会因为函数不存在而失败。解决依赖管理database-build模式本身不显式处理依赖顺序。Supabase CLI在内部处理一些基本依赖如先创建表再创建策略。但对于复杂的跨对象依赖需要开发者注意。实践建议避免在表定义中直接引用自定义函数作为默认值除非你能确保顺序。可以考虑在表创建后通过单独的迁移步骤来添加默认值。如果存在循环依赖可能需要将创建语句拆分先创建没有依赖的部分再通过ALTER语句添加依赖。这通常需要在生成的迁移脚本中进行手动调整。一种更高级的模式是使用一个主入口文件如supabase/migrations/deploy.sql在其中用正确的顺序\i包含其他子文件。但这超出了基础database-build的约定需要自定义构建脚本。5.4 种子数据的管理问题seeds/目录下的初始数据在多次重置数据库或在不同环境开发、测试初始化时可能会因为主键冲突、外键约束等原因插入失败。技巧使用UPSERT在种子数据脚本中使用INSERT ... ON CONFLICT (id) DO UPDATE SET ...语句来确保数据幂等性。即使重复运行数据也会被更新到指定状态而不是报错。处理依赖关系先插入没有外键依赖的表的数据再插入依赖表的数据。可以创建多个种子文件如01_basic_tables.sql,02_dependent_data.sql并通过数字前缀控制顺序。区分环境敏感的生产数据如真实用户信息绝对不应该放在代码库的种子文件中。种子文件应只包含必要的基础配置数据如角色类型、系统设置、无害的测试数据。可以使用环境变量或不同的种子文件来区分环境。这套模式用下来最大的体会是它强制你形成了良好的数据库开发习惯。一开始可能会觉得多了一层抽象有点麻烦但一旦团队适应它在代码审查、环境一致性、变更安全上的收益是巨大的。它把数据库schema从“黑盒”变成了代码库中一等公民这是现代应用开发中至关重要的一步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2599824.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…