我有一个相对简单的问题;然而,我很好奇这个惯例是什么,为什么会有这样一个惯例。数据库是PostgreSQL,我使用的编程语言是Python,但这不是我问题的核心。
假设我们有以下JSON数据结构,我们仍然需要解析它。
{
"harry": {
"transactions": {
"desc": ["fish", "drinks", "potatoes"],
"amount": [32, 12, 35]
},
"country": "UK"
},
"james": {
"transactions": {
"desc": ["computer", "water", "table", "phone"],
"amount": [100, 32, 59, 99]
},
"country": "China"
}
}
,我们想把它放在PostgreSQL数据库中。我倾向于为人员"harry"创建uid和";james"还有一些事务的uuid,然后将它们插入数据库。生成三个表:personal_info、trans和pi_trans(连接两个表)。
然而,也有人认为我让PostgreSQL数据库生成一个标识符(每次插入后增加1),然后我用从PostgreSQL检索到的标识符填充pi_trans表。
我认为后一种方法可能太慢了,但除此之外,我看不出任何其他明确的理由为什么我们不应该采用第二种方法。
此外,如果我们插入新记录,第二种方法确实允许唯一标识符,而前一种方法-可能-有id冲突(尽管我怀疑使用uuid的可能性非常小)。
谁能帮我弄清楚应该使用什么方法以及何时使用?
标识列(序列生成的值)和uuid都可以工作。uuid的碰撞概率是如此之小,以至于你可以放心地押注它(更有可能的是宇宙射线击中你的内存,并以一种返回重复值的方式破坏你的序列,或者你的数据库及其所有备份被太阳耀斑破坏)。
你可以在这里阅读我对主题序列与uid的思考;我的观点是,序列通常更可取。
如果您使用INSERT ... RETURNING id
,您可以检索自动生成的标识符,并且可以与cte一起重用它:
WITH pi AS (
INSERT INTO personal_info (...) VALUES (...)
RETURNING id
), t AS (
INSERT INTO trans (...) VALUES (...)
RETURNING id
)
INSERT INTO pi_trans (pi_id, trans_id)
SELECT pi.id, t.id
FROM pi CROSS JOIN t;