这已经困扰了我一段时间,我无法找到一个感觉正确的解决方案...
给出了一种OO语言,其中使用了对象属性的常规命名约定,并给出了如下示例对象:
{
id: 667,
firstName: "Vladimir",
lastName: "Horowitz",
canPlayPiano: true
}
我应该如何在PostgreSQL表中建模这个 struct ?
主要有三种 Select :
- 不带引号的camelCase列名称
- 引用的camelCase列名称
- 带下划线的无引号(小写)名称
它们都有各自的缺点:
不带引号的标识符会自动折叠为小写.这意味着您可以创建一个包含
canPlayPiano
列的表,但混合大小写永远不会到达数据库.判断表时,该列将始终显示为canplaypiano
——在psql、pgadmin、解释结果、错误消息等等.引用的标识符保留了它们的大小写,但一旦你这样创建它们,你就必须引用它们.注意,如果创建一个包含
"canPlayPiano"
列的表,SELECT canPlayPiano ...
列将失败.这会给所有SQL语句增加很多不必要的干扰.带有下划线的小写名称是明确的,但它们与应用程序语言使用的名称不匹配.你必须记住对存储器(
can_play_piano
)和代码(canPlayPiano
)使用不同的名称.它还可以防止某些类型的代码自动化,因为属性和DB列需要命名相同.
所以我被夹在一块石头和一块坚硬的地方之间(还有一块大石头;有三种 Select ).无论我做什么,总有一部分会感到尴尬.在过go 10年左右的时间里,我一直在使用选项3,但我一直希望会有更好的解决方案.
我很感激你给我的建议.
PS:我确实意识到了折叠大小写和引用的需要来自哪里——SQL标准,或者更确切地说是PostgreSQL对该标准的改编.我知道它是如何运作的;我更感兴趣的是关于最佳实践的建议,而不是关于PG如何处理标识符的解释.