写点什么

一项针对数据库 URI 标准的提议

  • 2013-12-24
  • 本文字数:1696 字

    阅读完需:约 6 分钟

大卫·惠勒提出了一种用于数据库连接的标准 URI 格式。该提议将允许基于不同技术构建的应用程序共用相同的连接串。这对于包括报表设计器、自动构建和部署工具以及 ORM 在内的众多工具都是有好处的。该提议以 db 作为方案名,紧随其后是数据库引擎名。这是第一个与当前做法不同的地方。它没有指定具体的驱动程序,而是留给应用程序自己决定。

对于跨平台的 URI 标准而言,这是关键。由于连接到同样的数据库引擎常常需要不同的驱动程序名,所以在 JDBC、OleDB 和 ODBC 之间共用连接串非常困难。即使在一种 API 中,也可能有多种驱动程序可用。

在引擎名之后是一组标准化的参数:用户名、密码、主机、端口和数据库名。这些参数总是以相同的顺序出现,这是又一个与当前做法不同的地方。

  • db:engine://[username[:password]@]host[:port][/dbname][?params]
  • db:engine:[dbname][?params]

任何数据库在“?”之后指定参数都非常像 HTTP 请求的查询参数。这些参数会使用标准的键 - 值格式。

最后是一个可选段,用符号“#”表示,用于指定具体的表或视图。

有若干格式都是遵循 engine://authority/dbname 这一惯例,该格式即是受此启发。

有人对使用前缀“db:”提出了若干反对意见。彼得·艾森特劳特写到,

我认为前缀 db:是没有必要。首先,我认为,RFC 3986 的语法规则不允许有两个方案前缀。其次,它没用。假设一款软件能够使用这些 URI,那么它也将能够通过方案本身知道需要做什么。

通常,URL 确定了用于访问资源的协议,但它并不是资源的性质。例如,一个 git 库可以通过几种不同的方案访问。没有单独的 git:URL 系统,更不用说 scm:git 或者其它什么实现。另外,浏览器能够通过诸如 http:和 ftp:等几种不同的协议访问文件。没有单独的 textfile:或者 video:URL 方案。真见鬼,文件甚至可能是一个数据库,因此,我希望有个像 SQLite 的东西,可以接受典型的 http:URL 作为其数据库 URL。

除了要求实现者尽力忠实地遵循 RFC 3986 外,我不认为有很多东西需要标准化。

我们也可以反驳上述观点。例如,如果没有一个通用的前缀,开发人员将不得不在操作系统中为应用程序能够连接的每个数据库引擎注册一个单独的前缀。当遇到先前不知道的数据库时,这种方案会允许应用程序提示用户,而不是简单地失败。这类似于每个文件类型都一个单独的前缀,而不是仅仅使用 http/https,然后由浏览器决定做什么。

大卫·惠勒在其声明中提到了其它需要考虑的问题。

首先,权限部分必须包含一个主机地址的要求阻止了可用于连接 Unix 套接字的只包含一个用户名的 URI 规范。其中,PostgreSQL 和 MySQL 提供经过身份验证的套接字连接。 RFC 3986 需要主机名,而其前身 RFC 2396 并不需要。此外,作为先例,文件 URI 也不需要。因此,我正考虑允许使用类似的方式连接到 PostgreSQL 数据库:

db:pg://postgres:secr3t@/

总之,允许用户信息中没有主机名是有意义的。

第二个问题是在权限部分之后的路径部分中不允许相对文件名。这里的问题是,大部分数据库引擎并不使用路径作为数据库名,因此,前面的斜杠毫无意义。例如,在 db:pg:localhost/foo 中,PostgreSQL 数据库的名称是 foo,而不是 /foo。但在 db:firebird:localhost/foo 中,Firebird 数据库的名称是路径 /foo。这样,每一种引擎实现必须知道路径部分是否是一个文件名。

但实际上,有些数据库可能允许为本地连接指定路径,为远程连接指定名称。Informix 似乎就支持这种变体。那么如何知道路径是文件路径还是命名的数据库呢?这两种变体是无法区分的。

RFC 2396 非常明确地规定,当路径部分在权限部分的后面时必须是绝对路径。但是,RFC 3986 只在没有权限部分时才禁止双斜杠。因此,我认为,对于绝对路径,最好是有第二道斜杠。使用简单名称或者相对路径的引擎可以直接将它们放在第一道斜杠后面,而绝对路径可以使用第二道斜杠:

  • 绝对路径: db:firebird://localhost//tmp/test.gdb
  • 相对路径: db:firebird://localhost/db/test.gdb
  • 名称: db:postgresql://localhost/template1

查看英文原文:**** A Proposal for a Database URI Standard

2013-12-24 06:071706
用户头像

发布了 256 篇内容, 共 98.9 次阅读, 收获喜欢 12 次。

关注

评论

发布
暂无评论
发现更多内容

AI界的革命!终于可以自动标注了!

百度大脑

人工智能 百度

uniapp+若依 开发租房小程序

詹Sir

大前端

鱼龙混杂的低代码市场,企业选型需关注哪些重点?

优秀

低代码 企业数字化转型

“阿里巴巴”再次出手,这份Github新开源303页Spring全家桶高级笔记,让你打开眼界

热爱java的分享家

Java 架构 面试 程序人生 编程语言

技术分享| 如何使用FFmpeg命令处理音视频

anyRTC开发者

音视频 WebRTC ffmpeg 视频通话

一文让你彻底搞懂Spring状态及原理,实现订单与物流解耦

热爱java的分享家

Java 架构 程序人生 编程语言 经验分享

Python爬虫采集,中介网互联网网站排行榜, 样本数量:58341

梦想橡皮擦

11月日更

Python量化数据仓库搭建系列1:数据库安装与操作

恒生LIGHT云社区

量化投资

【等保】等保3.0是什么意思?有等保3.0吗?

行云管家

网络安全 等保 等级保护 等保2.0

更改Apollo数据库为oracle

小鲍侃java

11月日更

动态模型之动态增减【FunTester测试框架】

FunTester

性能测试 接口测试 测试框架 FunTester 动态模型

一文读懂Hive数据存储格式

五分钟学大数据

11月日更

请说说RPC的一个请求的流程是怎么样的?

热爱java的分享家

Java 架构 程序人生 编程语言 经验分享

【高并发】从源码角度深度解析线程池是如何实现优雅退出的

冰河

Java 并发编程 多线程 高并发 异步编程

SCTL 涅槃重生:投入 RAL 的怀抱

SphereEx

Java 数据库 大前端 ShardingSphere SCTL

ApplePay应用内购(inapp)支付流程图

try catch

支付 applepay 苹果支付

一周信创舆情观察(11.8~11.14)

统小信uos

【混合云小知识】混合云四种形式简单说明

行云管家

云计算 公有云 私有云 混合云 云管理

元数据管理在数据仓库的实践应用

大数据技术指南

11月日更

想一个问题,在高并发中,如何部署奇数个节点?

热爱java的分享家

Java 架构 程序人生 编程语言 经验分享

DOM操作造成的页面卡顿问题及解决

CRMEB

腾讯北大合作的稀疏大模型训练加速方案HET入选国际顶会VLDB

科技热闻

教你用SQL进行数据分析

华为云开发者联盟

Python sql 数据分析 数据 BI 分析工具

问题也许没有看上去那么简单

神策技术社区

神策数据

武林大会之国产数据库风云榜-2021年11月

墨天轮

数据库 opengauss oceanbase 国产数据库

​Qt全球峰会2021中国站深入解读最新Qt 6.2长周期版本,助力企业数字化转型

.NET6 引入Autofac

面向对象的猫

.net6 快速上手.net6

flutter 开发中 vscode 插件推荐 2

坚果

flutter vscode 11月日更

如何定义SpringBoot项目配置文件中密码的加密

热爱java的分享家

Java 架构 程序人生 编程语言 经验分享

SpringBoot+WebSocket实时监控异常

热爱java的分享家

Java spring 架构 程序人生 编程语言

熵简技术谈 | 熵简科技在资管数据中台的探索与实践

熵简科技

数据挖掘 数据库 大数据 数据中台 数据分析

一项针对数据库URI标准的提议_语言 & 开发_Jonathan Allen_InfoQ精选文章