这已经困扰了我一段时间,我无法找到一个感觉正确的解决方案...

给出了一种OO语言,其中使用了对象属性的常规命名约定,并给出了如下示例对象:

{
    id: 667,
    firstName: "Vladimir",
    lastName: "Horowitz",
    canPlayPiano: true
}

我应该如何在PostgreSQL表中建模这个 struct ?

主要有三种 Select :

  1. 不带引号的camelCase列名称
  2. 引用的camelCase列名称
  3. 带下划线的无引号(小写)名称

它们都有各自的缺点:

  1. 不带引号的标识符会自动折叠为小写.这意味着您可以创建一个包含canPlayPiano列的表,但混合大小写永远不会到达数据库.判断表时,该列将始终显示为canplaypiano——在psql、pgadmin、解释结果、错误消息等等.

  2. 引用的标识符保留了它们的大小写,但一旦你这样创建它们,你就必须引用它们.注意,如果创建一个包含"canPlayPiano"列的表,SELECT canPlayPiano ...列将失败.这会给所有SQL语句增加很多不必要的干扰.

  3. 带有下划线的小写名称是明确的,但它们与应用程序语言使用的名称不匹配.你必须记住对存储器(can_play_piano)和代码(canPlayPiano)使用不同的名称.它还可以防止某些类型的代码自动化,因为属性和DB列需要命名相同.

所以我被夹在一块石头和一块坚硬的地方之间(还有一块大石头;有三种 Select ).无论我做什么,总有一部分会感到尴尬.在过go 10年左右的时间里,我一直在使用选项3,但我一直希望会有更好的解决方案.

我很感激你给我的建议.

PS:我确实意识到了折叠大小写和引用的需要来自哪里——SQL标准,或者更确切地说是PostgreSQL对该标准的改编.我知道它是如何运作的;我更感兴趣的是关于最佳实践的建议,而不是关于PG如何处理标识符的解释.

推荐答案

考虑到PostgreSQL使用带下划线的不区分大小写的标识符,您是否应该更改应用程序中的所有标识符以执行相同的操作?显然不是.那么为什么你认为相反的 Select 是合理的呢?

PostgreSQL中的约定是通过标准合规性和用户的长期经验的结合实现的.坚持下go .

如果列名和标识符之间的转换变得单调乏味,那就让计算机来做吧——他们擅长这样的事情.我猜几乎所有900万个数据库抽象库都能做到这一点.如果您有一种动态语言,那么在这种情况下,需要两行代码才能将列名交换为标识符.

Postgresql相关问答推荐

尽管违反了部分索引约束,Postgres 插入仍在发生

使用 pgAdmin 4 v7.4 在 Windows 11 上全新安装 PostgreSQL 15.3-3 无法启动 - 卡在正在加载 pgAdmin 4 v7.4...

为什么在 PostgreSQL 中忽略查询超时?

使用 Heroku CLI、Postgres 的 SQL 语法错误

获取 OperationalError: FATAL: sorry, too many clients already using psycopg2

冲突中的 Postgres 会更新复合主键

如何在 psycopg2 中使用服务器端游标

在 PostgreSQL 中Explain与explain analyze

返回 NULL 的空数组的 array_length()

PostgreSQL 权限解释

如何为查询执行设置语句超时

适配器 Ecto.Adapters.Postgres 未编译

返回 array_agg() 中的第一个元素

如何使用 Node.js 和 Postgresql 找到最后一个插入 ID?

Django:按月查询组

try 为 ror 应用程序设置 postgres,出现错误 - fe_sendauth:no password supplied

null 计算结果为 false 的情况

Postgresql varchar 是否使用 unicode 字符长度或 ASCII 字符长度计算?

Postgresql - 更新规则 - 可能有一个最后修改日期,自动更新该行的on update?

没有函数匹配给定的名称和参数类型