我有一個相對簡單的問題;但是我很好奇這個約定是什么以及這樣一個約定的原因是什么。資料庫是 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”和“james”的人創建 UUID 以及為他們的交易創建一些 UUID,然后將它們插入到資料庫中。產生三個表:personal_info、trans 和 pi_trans(鏈接這兩個表)。
但是,也有人可能會爭辯說我讓 PostgreSQL 資料庫生成一個識別符號(每次插入后增加 1),然后我用我從 PostgreSQL 檢索到的識別符號填充 pi_trans 表。
我認為也許后一種方法太慢了,但除此之外,我看不出有任何其他明確的理由為什么我們不應該采用第二種方法。
此外,如果我們插入新記錄,第二種方法確實允許唯一識別符號,而前一種方法 - 可能 - 有 id 沖突(盡管我懷疑使用 UUID 的機會非常小)。
有人可以幫我弄清楚應該使用什么方法以及何時使用嗎?
uj5u.com熱心網友回復:
標識列(序列生成的值)和 UUID 都適合您。UUID 的碰撞概率非常小,您可以放心地押注它(宇宙射線更有可能以回傳重復值的方式擊中您的記憶體并破壞您的序列,或者實際上您的資料庫及其所有備份都被破壞了通過太陽耀斑)。
您可以在此處閱讀我對主題序列與 UUID 的思考;我的觀點是序列通常更可取。
如果使用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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/317121.html
標籤:Python json PostgreSQL
上一篇:NestJSPostgresPrisma-錯誤型別“字串”不可分配給引數型別“TemplateStringsArray”|Sql'
下一篇:如何轉發可變的lambda
