写点什么

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

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

关注

评论

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

SpringCloudRPC远程调用核心原理:FeignRPC动态代理实例创建流程

爱好编程进阶

Java 面试 后端开发

linux之read命令

入门小站

gRPC学习之三:初试GO版gRPC开发

爱好编程进阶

Java 面试 后端开发

JVM基本概念

爱好编程进阶

Java 面试 后端开发

MQTT介绍及与其他协议的比较

爱好编程进阶

Java 面试 后端开发

格灵深瞳与华为签署合作协议,共同推进昇腾AI产业创新发展

Geek_32c4d0

昇腾AI

Eclipse快捷键 10个最有用的快捷键

爱好编程进阶

Java 面试 后端开发

JAVA学习(3)

爱好编程进阶

Java 面试 后端开发

Java程序员2021年金三银四面试必备:高速突击学习框架+性能优化

爱好编程进阶

Java 面试 后端开发

Kubernetes 常用命令大全

爱好编程进阶

Java 面试 后端开发

Mybatis延迟加载和查询缓存

爱好编程进阶

Java 面试 后端开发

keepalived实现双机热备

爱好编程进阶

Java 面试 后端开发

spring boot 配置liquibase

爱好编程进阶

Java 面试 后端开发

Mycat 多租户方案

爱好编程进阶

Java 面试 后端开发

Zookeeper+ActiveMQ集群搭建

爱好编程进阶

Java 面试 后端开发

东方园林召开2022年度全员大会

科技大数据

Java基础08 方法

爱好编程进阶

Java 面试 后端开发

Java性能优化的35个细节(珍藏版)

爱好编程进阶

Java 面试 后端开发

Java面试过了京东五面之后,发现掌握了这些技术也没有那么难

爱好编程进阶

Java 面试 后端开发

咨询公司也要挑客户吗?

秋去冬来春未远

数字化 信息化 客户 咨询

读《Software Engineering at Google》(07)

术子米德

架构师成长笔记

RabbitMQ 最常用的三大模式

爱好编程进阶

Java 面试 后端开发

区块链交易所源码开发搭建,多种交易所系统开发

Geek_56201b

区块链 交易所开发 区块链交易所搭建

GitOps的12个痛点

俞凡

DevOps 研发效能 gitops

Java工程师的进阶之路-Kafka篇(二)

爱好编程进阶

Java 面试 后端开发

MySQL:从B树到B+树到索引再到存储引擎

爱好编程进阶

Java 面试 后端开发

Spring学习--面向抽象编程(模拟Spring的简单实现)

爱好编程进阶

Java 面试 后端开发

CNCF生态蓝图的八个领域及路线图概述

穿过生命散发芬芳

4月月更

SpringBoot文件上传临时目录找不到的问题

爱好编程进阶

Java 面试 后端开发

SpringCloudRPC远程调用核心原理:feign

爱好编程进阶

Java 面试 后端开发

spring-cloud-kubernetes官方demo运行实战

程序员欣宸

#Kubernetes# spring-cloud java 4月月更

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