最佳答案
这已经困扰我一段时间了,我不能达成一个解决方案,感觉 对..。
给定一个面向对象语言,其中对象属性的通常变数命名原则是 camelcsed,并且给出一个像下面这样的示例对象:
{
id: 667,
firstName: "Vladimir",
lastName: "Horowitz",
canPlayPiano: true
}
我应该如何在 PostgreSQL 表中建模这个结构?
主要有三种选择:
它们各有缺点:
无引号的标识符自动折叠成小写。这意味着您可以创建一个包含 canPlayPiano
列的表,但是混合大小写永远不会到达数据库。当您检查表时,该列总是以 canplaypiano
的形式显示——在 psql、 pgadmin 中,解释结果、错误消息等等。
引用标识符保留它们的大小写,但是一旦像这样创建它们,一直都是就必须引用它们。IOW,如果创建一个包含 "canPlayPiano"
列的表,则 SELECT canPlayPiano ...
将失败。这会给所有 SQL 语句添加大量不必要的噪音。
带下划线的小写名称是明确的,但是它们不能很好地映射到应用程序语言所使用的名称。您必须记住对存储(can_play_piano
)和代码(canPlayPiano
)使用不同的名称。它还可以防止某些类型的代码自动化,其中属性和 DB 列的名称必须相同。
所以我被夹在一块石头和一块硬石头之间(还有一块大石头,有三种选择)。不管我做什么,总会有些尴尬。在过去10年左右的时间里,我一直在使用选项3,但我一直希望有一个更好的解决方案。
我很感激你的建议。
PS: 我确实知道折叠大小写和引号的需求来自哪里—— SQL 标准,或者更确切地说是 PostgreSQL 对该标准的改编。我知道它是如何工作的; 我更感兴趣的是关于最佳实践的建议,而不是关于 PG 如何处理标识符的解释。