REST API的数据库列命名

时间:2015-02-09 21:42:46

标签: json sqlite rest database-design camelcasing

TL / DR;

我的db和JSON-Keys中的列名都应该是camelCase

我的db和JSON-Keys中的列名都应该是uppercase SNAKE_CASE

长版

我正在设计一个与sqlite数据库通信的REST API。我一直在关注一些谷歌样式指南,特别是JSON的指南。正如它所提到的, camelCase 是JSON的首选样式。我还看到了 snake_case 更容易阅读的评论。

目前,我已经实现了执行SQL查询的函数,将结果作为表对象接收,然后使用json-smart将其转换为实际的JSON字符串。

我在数据库中使用的列名实际上是upper SNAKE_CASE,因为只有少数引用a standardized format for database column names。这个较高的SNAKE_CASE列名称将成为返回的JSON中键值对的一部分。

所以,既然我在设计的最初阶段,在我的数据库中使用camelCase列标签或坚持upper CAMEL_CASE似乎是合理的,从而打破了JSON标准?我不想在应用程序中的sql查询之后转换名称,因为这会增加不必要的复杂性和潜在的性能阻碍。

1 个答案:

答案 0 :(得分:1)

你可能会问错误的问题。

一些预赛

作为DBA,通过遵循一个接口指南来命名数据库对象远非最佳实践。我必须作为

的来源
  • HTML,
  • json,
  • XML,
  • text,
  • pdf,
  • 短信(短信),
  • 电子邮件,
  • 直接邮寄,
  • 其他我无法想到我的头脑。

用多种语言编写的程序访问数据库。

在SQL中,标识符可能会也可能不会被分隔(用引号括起来)。 SQL标准要求将无限制的标识符折叠为大写。这意味着select camelCase被处理为CAMELCASE。要保留大小写,您必须使用分隔标识符select "camelCase"

PostgreSQL通过折叠小写而偏离。 (列 foo Foo FOO 是相同的。)

SQLite通过仅使用双引号来识别标识符,而不是保留大小写。 (列" foo" " Foo" " FOO" 是相同的,但是作为列标题返回的名称会保留CREATE TABLE语句中的大小写,无论您是否使用分隔标识符。)

列名作为键

如果您打算将列名用作json键,那么您的问题才有意义。

PostgreSQL原生支持json 9.3+;默认情况下,它不使用列名作为json键。例如,这里PostgreSQL使用f1,f2,f3和f4作为json键而不是列名" cust_id"," addr_type"等。

select row_to_json(row(cust_id, addr_type, street_addr, city_name))
from test;
row_to_json
--
{"f1":1,"f2":"bill","f3":"123 Main St","f4":"Anytown"}

您可以使用公用表表达式获取任意键名。还有其他方法;没有一个特别愉快。

WITH data("custId", "addrType", "streetAddr", "cityName") AS (
  select cust_id, addr_type, street_addr, city_name 
  from test
)
SELECT row_to_json(data) FROM data;
row_to_json
--
{"custId":1,"addrType":"bill","streetAddr":"123 Main St","cityName":"Anytown"}

SQLite对json没有任何原生支持。所有json功能都必须来自应用程序代码。

所以你需要问一下,"我用的第一个应用程序语言是什么来从数据库查询创建json密钥?"它可能赢得成为您使用的最后一种语言。而下一个可能会以同样的方式工作。记住这一点。

我不认为我见过一种编程语言,默认情况下会在生成json时读取数据库元数据。