写点什么

一项针对数据库 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:071786
用户头像

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

关注

评论

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

微信朋友圈的高性能复杂度

大眼喵

「架构实战营」

华为云GaussDB(for Influx)揭秘第五期:最佳实践之子查询

华为云开发者联盟

数据库 华为云 GaussDB(for Influx) 子查询 InfluxQL

阿里二面:携程配置中心Apollo服务端是如何感知配置变化的

root

《手写Mybatis》第4章:Mapper XML的解析和注册使用

小傅哥

小傅哥 mybatis 工厂模式 建造者

分布式session之RedisSession的探索

Rubble

redis 4月日更 4月月更

架构训练营模块 2 作业

小马

「架构实战营」

PiFlow 发布企业级分布式关系型数据库 OceanBase 组件

OceanBase 数据库

oceanbase OceanBase 开源

[Day11]-[动态规划]让字符串成为回文串的最少插入次数

方勇(gopher)

LeetCode 数据结构和算法

Go服务错误堆栈收集降频策略

SFLYQ

后端 高并发 Go 语言 日志采集

spring-cloud 链路追踪

Rubble

4月日更

十年磨一剑,墨菲安全正式发布开源项目murphysec

墨菲安全

开源安全

微信朋友圈架构复杂度分析

Trent

直播预告|MobTech携手中国信通院共话数据治理建设实践

MobTech袤博科技

数据安全 火山引擎 信通院 MobTech袤博科技

Linux驱动开发-编写PCF8591(ADC)芯片驱动

DS小龙哥

4月月更

微信朋友圈的高性能复杂度分析

Geek_bc9c8d

模块二:微信朋友圈高性能复杂度分析

jiaoxn

「架构实战营」

架构实战营作业 - 模块二

haibin369

「架构实战营」

自己动手写Docker系列 -- 5.5实现容器停止

Go Docker 4月月更

B 端 SaaS 产品自动化事件设计 - 规则表达式

龙国富

自动化 SaaS 正则 B端 规则表达式

架构实战营-模块二作业

,lazy

#架构实战营 「架构实战营」

Test

haibin369

一文了解垃圾回收算法中的引用计数算法

宇宙之一粟

垃圾回收算法 引用计数 4月月更

Excelize 发布 2.6.0 版本,功能强大的 Excel 文档基础库

xuri

golang Excel Apache POI Go 语言 Excelize

分析微信朋友圈的高性能复杂度

Kevin

「架构实战营」

模块二作业:微信朋友圈高性能复杂度分析

杨波

「架构实战营」

微信朋友券的高性能复杂度

CityAnimal

架构实战营 #架构实战营 「架构实战营」

使用和风天气 API 10分钟搭建天气预报数据看板

蒋川

API 天气api

为啥JS/TS里都会有"use strict"

华为云开发者联盟

js ts 严格模式 use strcit 使用严格

快速尝鲜:RabbitMQ 搭建完就得用起来

阿Q说代码

RabbitMQ springboot 4月月更 消息确认机制

10个商品图策略,引导亚马逊卖家提升客户购物体验

龙国富

电商 商品 亚马逊 客户体验

微信朋友圈高性能复杂度

鱼恨水

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